使用CreateFile打开目录时,一般只能指定为GENERIC_READ,不能为GENERIC_WRITE。不过在NT下,可以在Flag中加入FILE_FLAG_BACKUP_SEMANTICS标志,就可以以写模式打开目录,从而可以修改目录的时间属性。hFile := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_Write, FILE_SHARE_READ or FILE_SHARE_Write, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_BACKUP_SEMANTICS, 0); ************************{ Sets the time for both files and directories } { for NT } function NT_SetDateTime(FileName: string; dtCreation, dtLastAccessTime, dtLastWriteTime: TDateTime): Boolean; // by Nicholas Robinson var hDir: THandle; ftCreation: TFiletime; ftLastAccessTime: TFiletime; ftLastWriteTime: TFiletime; function DTtoFT(dt: TDateTime): TFiletime; var dwft: DWORD; ft: TFiletime; begin dwft := DateTimeToFileDate(dt); DosDateTimeToFileTime(LongRec(dwft).Hi, LongRec(dwft).Lo, ft); LocalFileTimeToFileTime(ft, Result); end; begin hDir := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); if hDir <> INVALID_HANDLE_VALUE then begin try ftCreation := DTtoFT(dtCreation); ftLastAccessTime := DTtoFT(dtLastAccessTime); ftLastWriteTime := DTtoFT(dtLastWriteTime); Result := SetFileTime(hDir, @ftCreation, @ftLastAccessTime, @ftLastWriteTime); finally CloseHandle(hDir); end; end else Result := False; end; procedure TForm1.Button2Click(Sender: TObject); begin NT_SetDateTime('c:\temp\MyFolder', now, now, now); end;
我觉得应该打开一个文件夹,然后取得它的标示符(文件夹没有handle)
然后再用SetFileTime来该时间。
不过应该有windows api可以直接更改时间,但好像是隐藏的。
谁能帮忙呀!!!!
GENERIC_READ or GENERIC_Write,
FILE_SHARE_READ or FILE_SHARE_Write,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_BACKUP_SEMANTICS,
0);
************************{ Sets the time for both files and directories }
{ for NT } function NT_SetDateTime(FileName: string; dtCreation, dtLastAccessTime, dtLastWriteTime: TDateTime): Boolean;
// by Nicholas Robinson
var
hDir: THandle;
ftCreation: TFiletime;
ftLastAccessTime: TFiletime;
ftLastWriteTime: TFiletime; function DTtoFT(dt: TDateTime): TFiletime;
var
dwft: DWORD;
ft: TFiletime;
begin
dwft := DateTimeToFileDate(dt);
DosDateTimeToFileTime(LongRec(dwft).Hi, LongRec(dwft).Lo, ft);
LocalFileTimeToFileTime(ft, Result);
end; begin
hDir := CreateFile(PChar(FileName),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
0);
if hDir <> INVALID_HANDLE_VALUE then
begin
try
ftCreation := DTtoFT(dtCreation);
ftLastAccessTime := DTtoFT(dtLastAccessTime);
ftLastWriteTime := DTtoFT(dtLastWriteTime);
Result := SetFileTime(hDir, @ftCreation, @ftLastAccessTime, @ftLastWriteTime);
finally
CloseHandle(hDir);
end;
end
else
Result := False;
end; procedure TForm1.Button2Click(Sender: TObject);
begin
NT_SetDateTime('c:\temp\MyFolder', now, now, now);
end;