2011-12-09 18 views
8

Tôi đã tìm kiếm bây giờ cho HOURS trên Google (và ở đây).Delphi 6: Làm thế nào tôi có thể thay đổi được tạo đơn (= ngày tạo tập tin)

Và tôi không thể tìm thấy giải pháp.

Tôi muốn ĐỔI các "Created FILETIME" (= tạo FILETIME) trong Delphi 6.

Không phải là "Thời gian tệp được sửa đổi" (cần gọi đơn giản là "FileSetDate()") chứ không phải "Thời gian tệp được truy cập lần cuối".

Làm cách nào để thực hiện việc này?

Picture of what I mean...

Trả lời

6

Gọi SetFileTime của Windows hàm API. Vượt qua nil cho lpLastAccessTimelpLastWriteTime nếu bạn chỉ muốn sửa đổi thời gian tạo.

Bạn sẽ cần lấy một tệp xử lý bằng cách gọi CreateFile hoặc một trong các trình bao bọc Delphi, vì vậy đây không phải là API thuận tiện nhất để sử dụng.

Làm cho cuộc sống dễ dàng hơn cho chính bạn bằng cách gói API gọi lên trong hàm trợ giúp nhận tên tệp và TDateTime. Hàm này sẽ quản lý các chi tiết cấp thấp về việc thu thập và đóng trình xử lý tệp và chuyển đổi TDateTime thành FILETIME.

tôi sẽ làm điều đó như thế này:

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; 

tôi đã có thêm việc kê khai của FILE_WRITE_ATTRIBUTES bởi vì nó không có mặt trong đơn vị Delphi 6 Windows.

+0

Cảm ơn bạn rất nhiều !!!! – user1089764

7

Dựa trên FileSetDate, bạn có thể viết một thói quen tương tự:

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 !!!! Bạn đá! Cuối cùng cái gì đó hoạt động! – user1089764

Các vấn đề liên quan