Delphi 6:如何更改创建的提交者(=文件创建日期)

时间:2011-12-09 13:32:57

标签: file delphi date delphi-6

我现在正在谷歌(以及此处)搜索HOURS。

我无法找到解决方案。

我想更改&#34; 创建文件时间&#34; <=> DELPHI 6 中的(=创建文件时间)。

不是&#34;修改文件时间&#34; (需要简单调用&#34; FileSetDate()&#34;) 而不是&#34;上次访问的文件时间&#34;。

我该怎么做?

Picture of what I mean...

2 个答案:

答案 0 :(得分:7)

基于FileSetDate,您可以编写类似的例程:

function FileSetCreatedDate(Handle: Integer; Age: Integer): Integer;
var
  LocalFileTime, FileTime: TFileTime;
begin
  Result := 0;
  if DosDateTimeToFileTime(LongRec(Age).Hi, LongRec(Age).Lo, LocalFileTime) and
    LocalFileTimeToFileTime(LocalFileTime, FileTime) and
    SetFileTime(Handle, @FileTime, nil, nil) then Exit;
  Result := GetLastError;
end;

答案 1 :(得分:7)

调用SetFileTime Windows API函数。如果您只想修改创建时间,请nillpLastAccessTime通过lpLastWriteTime

您需要通过调用CreateFile或其中一个Delphi包装器来获取文件句柄,因此这不是最方便的API。

通过将API调用包装在一个接收文件名和TDateTime的辅助函数中,让自己的生活更轻松。此函数应管理获取和关闭文件句柄的低级细节,并将TDateTime转换为FILETIME

我会这样做:

const
  FILE_WRITE_ATTRIBUTES = $0100;

procedure SetFileCreationTime(const FileName: string; const DateTime: TDateTime);
var
  Handle: THandle;
  SystemTime: TSystemTime;
  FileTime: TFileTime;
begin
  Handle := CreateFile(PChar(FileName), FILE_WRITE_ATTRIBUTES,
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 0);
  if Handle=INVALID_HANDLE_VALUE then
    RaiseLastOSError;
  try
    DateTimeToSystemTime(DateTime, SystemTime);
    if not SystemTimeToFileTime(SystemTime, FileTime) then
      RaiseLastOSError;
    if not SetFileTime(Handle, @FileTime, nil, nil) then
      RaiseLastOSError;
  finally
    CloseHandle(Handle);
  end;
end;

我必须添加FILE_WRITE_ATTRIBUTES的声明,因为它在Delphi 6 Windows单元中不存在。