Изменение файла из исполняемого файла - в XP отказано в разрешении (но не в Vista) - PullRequest
0 голосов
/ 24 июня 2010

У меня есть приложение, в котором мне нужно открыть XML-файл, изменить его и снова закрыть.Когда я тестирую код на ноутбуке под управлением Windows Vista, он работает отлично, но в Windows XP я даже не могу открыть файл для доступа на чтение / запись:

errno_t _wfopen_s(&inStream, m_fileName, L"r+, ccs = UTF-8");

... без получения ошибкикод 13, «В доступе отказано» (хотя файл будет открываться без проблем, если я выберу «r» вместо «r +» для указания доступа только для чтения). Тем не менее, все права доступа к файлу установлены соответствующим образом, насколько яможно увидеть, и файл можно без труда открыть и изменить из графического интерфейса.

Что может быть причиной этого? Любые предложения приветствуются.

1 Ответ

0 голосов
/ 24 июня 2010

Ну, с помощью r + вы запросите доступ для записи в файл.Привилегию, которую труднее получить, выполните тройную проверку, чтобы учетная запись пользователя действительно имела право записи в папку.

Но звучит так, как будто вы уже это проверили.Следующее рассмотрение делится.Функция fopen () совершенно не подходит для современных многозадачных операционных систем, она позволяет любому процессу получать доступ к открытому файлу, а также читать и записывать в него.Это редко бывает хорошим концом, особенно совместное использование записи может привести к появлению мусора, только если процессы не согласовывают доступ к файлу.

Вот почему в Microsoft CRT есть функция fopen_s (), она гарантирует, что записьсовместное использование запрещено.Это очень редко, что вы хотели бы позволить это.Когда вы передаете «r», тогда разрешается совместное чтение.Когда вы передаете "r +", то нет совместное использование разрешено.Это может не сработать, если какой-то другой процесс уже открыл файл для чтения.

Вам нужно найти этот другой процесс.Утилита SysInternals 'Handle может помочь вам найти ее. Также учтите, что это может быть ваша собственная программа.

В общем, сами управляйте совместным использованием, используйте вместо этого функцию _wfsopen ().Обратите внимание, что для него нет безопасной версии, потому что она не нужна.

...