3

FILE_FLAG_BACKUP_SEMANTICS也在尝试在使用后更改目录的时间戳。我的代码片段如下

    int SetDirectoryTime(char *Path)
    {
        FILETIME ftCreate, ftAccess, ftWrite;
        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, &ftCreate, &ftAccess, &ftWrite) == 0)
        {
            //Unable to set directory time
            CloseHandle(Handle);
            return FALSE;
        }
    }

我能够获得一个有效的句柄,但 SetFileTime 正在返回拒绝访问。我尝试了 EnablePrivilege SE_BACKUP_NAMESE_RESTORE_NAME但仍然被拒绝访问。

4

2 回答 2

3

由于 MSDN 页面上明确记录了要设置时间的文件的句柄,因此必须具有权限。SetFileTime FILE_WRITE_ATTRIBUTES

而你的手柄,很明显,没有。

所以你有它。

于 2013-08-13T06:26:46.193 回答
0
const
  cWRITE_FILE_ATTIRIBUTES = $100;   // not defined in Delphi7                                                  

var
  cfAttributes    : dword;
  cfDesiredAccess : dword;
  cfShareMode     : dword;
  hndFile         : THandle;
  ftAccessed      : TFileTime;
  ftCreated       : TFileTime;
  ftModified      : TFileTime;

begin
  cfAttributes    := cWRITE_FILE_ATTIRIBUTES OR FILE_FLAG_BACKUP_SEMANTICS;
  cfDesiredAccess := GENERIC_READ OR GENERIC_WRITE;
  cfShareMode     := FILE_SHARE_READ OR FILE_SHARE_WRITE;
  hndFile         := CreateFile(pchar(_FQFN),
                                cfDesiredAccess,
                                cfShareMode,
                                nil,
                                OPEN_EXISTING,
                                cfAttributes,
                                0);
  SetFileTime(hndFile, @ftCreated, @ftAccessed, @ftModified);
end;

此代码在 Delph7 下可以正常工作以更改目录的时间戳。_FQFN 是带有尾部反斜杠的路径。

为了清楚起见,错误检查被删除并格式化。

于 2018-10-26T00:59:02.827 回答