C++ CreateFile GetFileTIme SetFileTime

C++ CreateFile GetFileTIme SetFileTime,c++,winapi,C++,Winapi,我在使用GetFileTime和SetFileTime时遇到问题 当涉及到目录时。具体来说,我认为我的问题是 我是WinAPI的新手,我不认为我得到了 正确处理 有两种情况 首先,我只需要一个句柄来获取文件或目录 时间戳(创建、访问、修改)。我想用安全灵活的方式做这个把手。 不要在参数上过于慷慨 在第二种情况下,我需要一个允许我修改文件或目录的句柄 时间戳。我还想创建这个处理和最低限度的权利,但在灵活和可靠的方式 所谓灵活,我的意思是,在这两种情况下,我都需要代码在本地、网络共享和多线程应用程序

我在使用GetFileTime和SetFileTime时遇到问题 当涉及到目录时。具体来说,我认为我的问题是 我是WinAPI的新手,我不认为我得到了 正确处理

有两种情况

首先,我只需要一个句柄来获取文件或目录 时间戳(创建、访问、修改)。我想用安全灵活的方式做这个把手。 不要在参数上过于慷慨

在第二种情况下,我需要一个允许我修改文件或目录的句柄 时间戳。我还想创建这个处理和最低限度的权利,但在灵活和可靠的方式

所谓灵活,我的意思是,在这两种情况下,我都需要代码在本地、网络共享和多线程应用程序中工作。多线程部分不是必需的,因为我的应用程序不会在文件/dir上生成多个句柄,但也有可能在后台运行的其他应用程序会生成多个句柄

//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:要使用
CreateFile
获取目录句柄,需要使用
FILE\u标志\u BACKUP\u语义
标志。使用您的示例:

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

我想这也适用于答案#4,但我还没有尝试确认。

下面是一个关于如何根据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;
}

谢谢Joel,文件标志备份语义工作正常。我很难理解MS文档中文件标志备份语义的含义。这到底是什么?希望有人也能批评我使用的其他标志。我还应该注意,访问时间戳与上面的代码有点不一致。它似乎没有被可靠地设置。@user440297-FILE\u FLAG\u BACKUP\u语义实际上是备份软件为了进行备份而访问文件。这样,使用它使CreateFile获得目录句柄感觉有点像黑客。然而,从我在MSDN中看到的情况来看,这是一条路。再次感谢Joel Rondeau。文件\u属性\u归档和文件\u标志\u备份\u语义(都是dwFlagsAndAttributes的一部分)之间有什么区别?我对获取属性和设置属性感兴趣。。。所以我所做的是以备份为中心的。我应该使用文件\u属性\u存档吗?如果是,为什么以及如何使用?简而言之,一个是属性,另一个是标志,所以它们之间并没有真正的关联。文件属性归档只是一个文件属性(可以使用资源管理器查看)。启用此属性只是将文件标记为需要存档。我能想到的最好的例子就是源代码控制。TFS将在文件签出时设置存档属性,并在签入时清除该属性。因此,不,我认为您不一定需要使用archive属性。对于任何想知道的人,这里是在打开目录句柄时调用FILE\u FLAG\u BACKUP\u语义的参考。