修改文件相关信息(100分)

  • 主题发起人 主题发起人 lshren
  • 开始时间 开始时间
L

lshren

Unregistered / Unconfirmed
GUEST, unregistred user!
如何修改文件信息:
1.创建时间
2.最后修改时间
3.最后访问时间

本人使用API: setfiletime 如下:
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
x,y,z:pfiletime;
begin
i:= fileopen(edit1.text,fmOpenReadWrite);
x:=PFileTime(DateTimeToFileDate(strtodate('1999-09-01')));
y:=PFileTime(DateTimeToFileDate(strtodate('1999-09-02')));
z:=PFileTime(DateTimeToFileDate(strtodate('1999-09-03')));
setfiletime(i,x,y,z);
fileclose(i);
end;

以上代码出错: exception class eAccessViolation with message 'Access violation
at address 77edd975 in module 'kernel32.dll',Read of address 27210000'
请各位大侠帮忙。

 
看正确的:
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
x,y,z:TFiletime;//变
begin
i:= fileopen(edit1.text,fmOpenReadWrite);
x:=DateTimeToFileTime(strtodate('1999-09-01')); //变
y:=DateTimeToFileTime(strtodate('1999-09-02')); //变
z:=DateTimeToFileTime(strtodate('1999-09-03')); //变
setfiletime(i,@x,@y,@z); //变
fileclose(i);
end;
其中DateTimeToFileTime是将Pascal格式的时间转换为文件时间的函数:
function DateTimeToFileTime(DateTime:TDateTime):TFileTime;
var
SystemTime:TSystemTime;
begin
with SystemTime do
begin
DecodeDate(DateTime, wYear, wMonth, wDay);
DecodeTime(DateTime, wHour, wMinute, wSecond, wMilliSeconds);
end;
SystemTimeToFileTime(SystemTime,Result);
end;

你知道问题出在哪里了吗?
PFileTime是指向TFileTime的指针,而DateTimeToFileDate返回的是一个用整数表示的
文件日期(恰好它们都是4个字节,所以类型转换通过),把日期作为指针传给SetFileTime,
要是还不出错那就真TMD怪了!

 
谢谢龙丹的回答!
 
我试了,怎么没改掉??
 
成功了,要输入文件路径
 
最后访问时间怎么还修改不了,其它都正常。请高手赐教谢谢。

 
后退
顶部