2011-02-15 69 views
3

對於目錄,我無法使用GetFileTime和SetFileTime 。具體而言,我認爲我的問題是 ,我是WinAPI的新手,我不認爲我正確獲得了 HANDLE。CreateFile GetFileTIme SetFileTime

有兩種情況。

在第一個,我只需要一個句柄來獲取文件或目錄 時間戳(創建,訪問,mod)。我想以安全和靈活的方式製作這個手柄。 不想在參數上過於慷慨。

在第二個,我需要一個句柄,將允許我修改文件或direcotry 時間戳。我也想用最小的權限創建這個句柄,但是靈活可靠。

通過靈活我的意思是,在這兩種情況下,我需要代碼在本地,網絡共享和多線程應用程序中工作。多線程部分不是必需的,因爲我的應用程序不會在文件/目錄上創建多個句柄,但可能會在後臺運行一些其他應用程序。

//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). 

回答

4

答案#2:要使用CreateFile來得到一個處理一個目錄,你需要使用FILE_FLAG_BACKUP_SEMANTICS標誌。使用你的例子:

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

我想這會爲答案#4以及工作,但我還沒有嘗試過確認。

+0

謝謝Joel,FILE_FLAG_BACKUP_SEMANTICS工作。我很難在MS文檔中破譯FILE_FLAG_BACKUP_SEMANTICS的含義。這究竟是什麼?希望有人也可以批評我使用的其他旗幟。我還應該注意到ACCESS時間戳與上面的代碼有些差別。它似乎沒有可靠地設置。 – user440297 2011-02-15 15:32:34

0

以下是有關如何根據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; 
}