Невозможно получить доступ к файлам INI в «Program Files» - PullRequest
3 голосов
/ 07 июля 2010

Я написал это приложение на C ++, которое должно проверить INI-файл («preference.ini») и в конечном итоге изменить его (например, если пользователь больше не хочет видеть форму введения).Я создал его в WinXP, и он отлично работает в системе, где я его скомпилировал (во многих местах, включая «Program Files»).

Проблема:

  1. В Win 7,это работает нормально, если я помещаю полную папку программы в «C»: \ »(например,« C: \ MyProgram »), но если я помещаю ее в« C: \ Program Files (x86) \ MyProgram », она просто получает некоторыетаинственные данные (значения отсутствуют в моем INI-файле).Когда я изменяю некоторые настройки и сохраняю их в файл, он (по-видимому) сохраняет изменения (не получает ошибок, но изменений нет, когда я иду и открываю файл ...
  2. У меня была похожая проблемав системе с другой системой WinXP (не той, где я ее скомпилировал.

Я использовал 'getcwd', чтобы определить путь во время выполнения, и я убедился, что он получает его правильно, даже в разделе "Программные файлы (x86) ":

char currentPath[MAXPATH];
getcwd(currentPath, MAXPATH);
std::string licensePath(currentPath);
licensePath.append("\\dat\\preference.ini");'

Есть идеи? Заранее спасибо за помощь.

Ответы [ 4 ]

8 голосов
/ 07 июля 2010

Ответ, как уже сказал @Kirill, - Win7 не позволит вам записывать данные в Program Files, если у вас нет разрешений выше обычных (Запуск от имени администратора). В этом случае это может быть перенаправление ваших файловых записей так, чтобы они все еще работали, но сами данные не сохраняются в файлах Progam.

Чтобы добавить к его ответу: В общем случае (если вы не хотите запускать свое приложение в качестве администратора), вам не следует записывать какие-либо данные программы в папку Program Files.

Настройки приложения должны храниться в одной из папок AppData. Вы можете получить доступ к данным приложения пользователя вручную, перейдя в меню поиска в меню «Пуск» (Vista / Win7) и набрав %appdata%.

Чтобы найти это местоположение в своем коде, используйте SHGetFolderPath с CSIDL_APPDATA (текущий пользователь) или CSIDL_COMMON_APPDATA (все пользователи).

3 голосов
/ 07 июля 2010

Это может быть связано с тем, что Windows использует виртуализацию файловой системы. Вы можете прочитать здесь об этом. Проверьте, находится ли ваш INI-файл в <root>\Users\<User_name>\AppData\Local\VirtualStore.

0 голосов
/ 07 июля 2010

Эта статья о разработке игр, но содержит лучшее описание того, как и почему это происходит, что мне удалось найти

http://msdn.microsoft.com/en-us/library/ee419001(VS.85).aspx

В этом абзаце статьи описывается, чтоСкорее всего, это происходит -

Попытка создать или записать файл или каталог в папке, которая не дает разрешения на запись для процесса, не удастся выполнить в Windows Vista, если приложение не имеет прав администратора.Если ваш 32-битный исполняемый файл игры работает в устаревшем режиме, поскольку он не объявил запрошенный уровень выполнения, его операции записи будут выполнены успешно, но они будут подвергнуты виртуализации, как описано в разделе «Совместимость UAC с более старыми играми» далее вэта статья.

0 голосов
/ 07 июля 2010

Мне кажется, что licensePath: getcwd() + "\\dat\\preference.ini" - это не то, что вы ожидаете.

Зарегистрируйте это значение (в консоли или в файле журнала) и посмотрите, что именно является значением licencePath при запуске вашей программы из разных папок.

...