Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование Shortcut to file  (Прочитано 13317 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ezus
Опытный

il
Offline Offline

« : 28-08-2011 14:38 » 

Добрый день.

Проблемка:
С++DLL используется в различных .NET проектах, каждый из которых стартуется из своей папки, содержащей свою копию исполнительного файла DLL. DLL должен прочитать текстовый файл параметров - единый на все случаи использование DLL.

В настоящий момент файл открывается
Код:
FILE* fl = fopen("prms.txt","r");

Это требует копирования этого файла во все проекты.

Как этого избежать? Т.е. иметь этот файл только в одной папке, а в других ссылку на него?

Использование "Shortcut to file" в лоб у меня не прошло. *.lnk - тоже.
Надеюсь есть простое решение, а я просто глючу.

Спасибо.




Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 28-08-2011 15:34 » 

ezus, в файловой системе NTFS реализованы функции жёстких ссылок (аналогично ln в UNIX) и символических (мягких) ссылок (аналогичная ln -s в UNIX).

Мягкая ссылка: физически файл находится в одном месте диска и отображается в одну папку, а в других местах создаются физически небольшие файлики, аналогичные shortcut, но обращение к которым перехватывает драйвер файловой системы и подставляет вместо них исходный файл. При удалении или переименовании исходного файла символические ссылки оказываются ошибочными.

Жёсткая ссылка: физически файл находится в одном месте диска, но отображается сразу в несколько папок диска (или в несколько имён файла в одной папке). Удаление файла с диска происходит при удалении последней ссылки на него, переименование одной из жёстких ссылок никак не сказывается на остальных.

http://support.microsoft.com/default.aspx?scid=kb;en-us;205524

Штатных средств Windows для работы с этими функциями нет. Однако в пакете Microsoft Windows Resource Kit есть утилита linkd, которая позволяет работать с файловыми ссылками.
« Последнее редактирование: 28-08-2011 15:46 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
ezus
Опытный

il
Offline Offline

« Ответ #2 : 28-08-2011 15:54 » 

Dimka
Спасибо, это я знаю.
Но почему-то не работает.

Код:
FILE* fl = fopen("prms.txt","r");

Ручками выполняю в нужной папке New->Shortcut->....->Finish

В папке создается ссылку на нужный файл.
 Запускаю.

Получаю fl == NULL.

Где ошибка?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 28-08-2011 16:18 » 

ezus, нет, ты не понял.

Shortcut (ярлык) - это не ссылка файловой системы. Это отдельный файл типа "ярлык" с расширением lnk, который обрабатывается исключительно программой explorer. Она его обрабатывает точно так же, как и все остальные зарегистрированные типы файлов - запускает ассоциированную с расширением lnk обработку. Ярлыки появились в Windows 95 и работают на любой файловой системе. Поскольку твоя программа - это не explorer, то ты этим воспользоваться не можешь, для твоей программы ярлык - это просто небольшой файлик.

В твоём случае полностью аналогичным обработке ярлыков было бы создание файликов prms.txt, внутри которых была бы строка с путём к единственному для всех истинному файлу prms.txt. И в коде у тебя была бы реализована двухуровневая обработка: сначала чтение из prms.txt пути истинного файла, затем чтение собственно истинного файла.


То, что я написал, это совсем другое. Это функция конкретной файловой системы NTFS версии 5.x и выше (начиная с Windows 2000). Она никак не доступна ни при помощи explorer, ни при помощи командной строки - только при помощи специальной утилиты. И такие ссылки были бы "прозрачны" для твоей программы - т.е. она бы не заметила разницы между ссылкой и собственно файлом.
« Последнее редактирование: 28-08-2011 16:22 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
ezus
Опытный

il
Offline Offline

« Ответ #4 : 29-08-2011 07:41 » 

Похоже, действительно не понял.
А надо понимать так, что у меня нет возможности построить "ссылки" так, чтобы моей программе было безразлично что в папке - сам файл или какая-то ссылка на него?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 29-08-2011 10:32 » 

ezus, есть, если ты установишь Windows Resource Kit и применишь утилиту linkd.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
ezus
Опытный

il
Offline Offline

« Ответ #6 : 29-08-2011 11:04 » 

"Все" ясно
Спасибо.
Записан
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 29-08-2011 15:36 » 

ezus, С хардовыми ссылками могут возникнуть (и возникнут) проблемы при копировании всего этого добра на другую машину... Не лучше ли положить конфиг например в Application Data или использовать относительные пути?
Код: (C++)
FILE* fl = fopen("..\\config\\prms.txt","r");
Или третий вариант - отказаться от текстового конфига и положить все параметры в реестр?
« Последнее редактирование: 29-08-2011 15:38 от RuNTiME » Записан

Любимая игрушка - debugger ...
ezus
Опытный

il
Offline Offline

« Ответ #8 : 31-08-2011 14:41 » 

Спасибо за варианты - их действительно множество.
Так как это проблема периода отладки, то корежить код очень не хотелось.

Решение - просто копии файлов. Провоцирует ошибки, но зато минимум затрат.
Классическая ситуация выбора подходящего критерия.
Записан
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 31-08-2011 15:29 » 

ezus, ну если так не хочется корежить код (и #define не катит), то можно написать небольшой батник, который будет в один клик копировать конфиг во все папки.
Записан

Любимая игрушка - debugger ...
ezus
Опытный

il
Offline Offline

« Ответ #10 : 01-09-2011 13:50 » new

Да, это я и сделал
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines