2015-04-21 5 views
2

Следующая программа не работает при компиляции с Visual Studio 2010 на Windows 7:Чувствительные к регистру переименование файлов не работает

#include <stdio.h> 

int main() 
{ 
    int status; 

    status = rename("C:\\Temp\\A.dat","C:\\Temp\\a.dat"); 
    status = rename("C:\\ProgramData\\A.dat","C:\\ProgramData\\a.dat"); 

    return 0; 
} 

Первое переименование работает, но вторые переименования не работают. Функция переименования возвращает 0 в обоих случаях. Что такого особенного в c: \ ProgramData, который не позволяет работать с чувствительным к регистру переименованием?

Just FYI, программа отлично работает при компиляции с cygwin gcc 4.8.3.

+0

Возможно, авторитет письма не является. проверьте свойство 'c: \ ProgramData' -> вкладка безопасности ->« Пользователи »(или другие). также используйте консоль администрирования. – BLUEPIXY

+0

Вместо этого вы можете попытаться использовать MoveFile() и проверить GetLastError(), чтобы определить ошибку. –

+0

Почему вы ожидаете, что это будет вести себя так или иначе? Ни документация C, ни документация Windows не говорят, что именно должно произойти в этом случае. –

ответ

1

C:\ProgramData имеет параметры безопасности, которые не позволяют стандартным пользователям писать там. Это не нова в Windows 8, Windows 7 была такой же, и аналогичная папка на Vista также защищена таким образом. Возможно, ваша среда Windows 7 UAC не отключена, или, возможно, у вас есть C:\ProgramData или C:\ProgramData\MyProgramName, чтобы разрешить доступ на запись для обычного пользователя.

Somethings вы должны кое-что о UAC

Когда Microsoft представила UAC им нужен способ для более старые приложения, чтобы продолжить работу, по крайней мере на некоторое время. То, что они придумали, было «Виртуализация файлов и реестров», где устаревшие приложения, которые пытались получить доступ (сейчас -) verboten Системные папки или записи реестра будут перенаправлены на их собственную «виртуализированную» копию этих ресурсов для каждого пользователя. Как статья Википедии на UAC.

Чтобы выразить это бесплатно, ProgramData содержит данные приложения, которое не относится к пользователю. Эти данные будут доступны всем пользователям на компьютере.

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

Другой подход заключается в том, чтобы установщик создал подпапку C: \ ProgramData, которая была защищена, чтобы разрешить доступ на запись для стандартного пользователя или любого другого пользователя/группы, которую разработчик считает подходящим.

Если у вас есть привилегии «Запуск от имени администратора», вы сможете избежать этой проблемы.

+1

Это не объясняет разницу в поведении между двумя компиляторами. –

+0

Не следует ли 'rename()' указывать на ошибку (и, вероятно, установить 'errno') в случае недостаточных прав доступа? (https://msdn.microsoft.com/en-us/library/zw5t957f%28v=vs.100%29.aspx) – alk

+0

@alk Каждая из этих функций возвращает 0, если она успешна. При ошибке функция возвращает ненулевое значение и устанавливает errno в одно из следующих значений: EACCES; ENOENT; EINVAL – Vineet1982