CreateFile GetFileTIme SetFileTime - PullRequest
       0

CreateFile GetFileTIme SetFileTime

4 голосов
/ 15 февраля 2011

У меня проблемы с использованием GetFileTime и SetFileTime когда дело доходит до каталогов. В частности, я думаю, что моя проблема что я новичок в WinAPI, и я не думаю, что я получаю ОБРАЩАЙТЕСЬ правильно.

Есть 2 сценария.

Во-первых, мне просто нужен дескриптор, чтобы получить файл или каталог метки времени (создание, доступ, мод). Я хотел бы сделать эту ручку безопасным и гибким способом. Не хочу быть слишком щедрым в параметрах.

Во-вторых, мне нужен дескриптор, который позволит мне изменить файл или директорию метки времени. Я также хотел бы создать этот дескриптор с минимальными правами, но гибким и надежным способом.

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

//QUESTION 1:
//I do this when I just need a handle to **GET** some attributes like dates.
//(here I just need a handle to get info I am not modding the item).
//Am I using the correct params if I need it to work in a 
//local + networked environment and also in a multi-threaded app???
h1 = CreateFile(itemA, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if (h1 == INVALID_HANDLE_VALUE){

    return 0;
}
//QUESTION 2:
//The above works for local files but not local dirs.
//How can I get the above to work for dirs? (Same environment considerations).


//QUESTION 3:
//I do this when I just need a handle to ***SET*** some attributes (like timestamps).
//(here I need a handle that allows me to modd the items timestamp).
//Am I using the correct params if I need it to work in a 
//local + networked environment and also in a multi-threaded app???
hItemB = CreateFile(itemB, FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if (hItemB == INVALID_HANDLE_VALUE){
    return 0;
}
//QUESTION 4:
//The above works for local files but not local dirs.
//How can I get the above to work for dirs? (Same environment considerations).

Ответы [ 2 ]

4 голосов
/ 15 февраля 2011

Ответ # 2: Чтобы использовать CreateFile, чтобы получить указатель на каталог, вам необходимо использовать флаг FILE_FLAG_BACKUP_SEMANTICS.Используя ваш пример:

h1 = CreateFile(itemA, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);

Полагаю, это сработает и для ответа №4, но я не пытался его подтвердить.

0 голосов
/ 07 мая 2011

Вот пример кода о том, как установить дату каталога на основе метки времени DOS.

int Directory_SetDosTime(char *Path, unsigned int DosDateTime)
{
    FILETIME LocalTime, FileTime;
    HANDLE Handle;
    SYSTEMTIME SystemTime;


    DosDateTimeToFileTime((DosDateTime >> 16), DosDateTime, &LocalTime);
    LocalFileTimeToFileTime(&LocalTime, &FileTime);
    FileTimeToSystemTime(&FileTime, &SystemTime);

    Handle = CreateFile(Path, GENERIC_WRITE, FILE_SHARE_WRITE,
                    NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);

    if (Handle == INVALID_HANDLE_VALUE)
    {
        //Unable to open directory
        return FALSE;
    }

    if (SetFileTime(Handle, &FileTime, &FileTime, &FileTime) == 0)
    {
        //Unable to set directory time
        CloseHandle(Handle);
        return FALSE;
    }

    CloseHandle(Handle);
    return TRUE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...