2011-12-09 45 views
8

私はHOURS on Google(およびここから)を探しています。Delphi 6:作成したファイルを変更する方法(ファイル作成日時)

解決策が見つかりません。

私はDELPHI 6CHANGE "作成さ FILETIME"(=創造FILETIME)にしたいです。

「変更されたファイル時間」(「FileSetDate()」の簡単な呼び出しが必要) ではなく、「最後にアクセスされたファイル時間」ではありません。

どうすればよいですか?

Picture of what I mean...

答えて

6

コールSetFileTime Windows API関数。作成時間を変更したい場合はnillpLastAccessTimeに、lpLastWriteTimeに渡してください。

CreateFile、またはDelphiラッパーの1つを呼び出すことによってファイルハンドルを取得する必要があります。このため、これは最も便利なAPIではありません。

ファイル名とTDateTimeを受け取るヘルパー関数でAPI呼び出しをラップすることで、自分の生活を楽にします。この関数は、ファイルハンドルの取得とクローズの低レベルの詳細を管理し、TDateTimeFILETIMEに変換する必要があります。

私はこのようにそれを行うだろう:それは、Delphi 6のWindowsユニットに存在しないので、私はFILE_WRITE_ATTRIBUTESの宣言を追加する必要がありました

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; 

+0

ありがとうございました!!!! – user1089764

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; 
+0

Yeahhhh !!!!あなたはロック!最後に動作するもの! – user1089764