2015-02-16 2 views
0

Когда я используюПолучить время изменения заблокированной папки с буст :: файловой системой :: last_write_time

time_t t = last_write_time("C:\\System Volume Information"); 

я получаю следующее исключение:

boost::filesystem::last_write_time: Access denied: "C:\System Volume Information" 

Тем не менее, Windows Explorer может получить доступ к этой информации. Похоже, Boost требует дополнительного доступа к папке, и именно по этой причине код не работает.

Можно ли как-то сделать обходное решение?

Редактировать. Вот цитата из libs\filesystem\src\operations.cpp:1312:

handle_wrapper hw(
    create_file_handle(p.c_str(), 0, 
    FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0, 
    OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)); 

Я не понимаю, что случилось с ним еще.

+0

Я думаю, что очевидный ответ будет: не с 'повышение :: файловая система :: last_write_time' Я думаю, что очевидный ответ будет: не с' повышение :: файловая система :: last_write_time'. Там migth будет подходом Win32, возможно, с достаточными привилегиями. И тогда может быть подход «канонический стрельба» с помощью Volume Shadow Copy ... – sehe

+0

@sehe В случае, если это невозможно с Boost, это ошибка, о которой следует сообщить. –

+0

Почему? Это ограничение ОС ограничить доступ к определенной информации. Задача разработчика - обрабатывать ошибки:/ – sehe

ответ

4

Эта папка не работает даже пользователям с учетной записью администратора, она содержит точки восстановления. Не то, чтобы вы не могли изменить ACL с такой учетной записью, но это, конечно, не правильное решение. Попытка открыть дескриптор в каталоге слишком тяжелая, вместо этого используйте FindFirstFile(). Как это:

WIN32_FIND_DATA info; 
auto hdl = FindFirstFile(L"C:\\System Volume Information", &info); 
if (hdl == INVALID_HANDLE_VALUE) throw win32_error(GetLastError()); 
SYSTEMTIME time; 
FileTimeToSystemTime(&info.ftLastWriteTime, &time); 
// etc.. 
//... 
FindClose(hdl); 
+0

Удивительное решение! –

+0

Это лучшее решение, но обратите внимание, что если вы * * должны открыть дескриптор, вам не нужно будет менять ACL, чтобы это сделать. Если вы включите поддержку резервного копирования и восстановления, CreateFile будет игнорировать ACL. –

Смежные вопросы