当前位置:编程学习 > Delphi >>

Delphi 文件处理实例(6)

取得该快捷方式的指向EXE
关键词:快捷方式 LNK
[delphi]
implementation 
uses activex,comobj,shlobj; 
{$R *.dfm} 
function ResolveLink(const ALinkfile: String): String; 
var 
link: IShellLink; 
storage: IPersistFile; 
filedata: TWin32FindData; 
buf: Array[0..MAX_PATH] of Char; 
widepath: WideString; 
begin 
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, link)); 
OleCheck(link.QueryInterface(IPersistFile, storage)); 
widepath := ALinkFile; 
Result := 'unable to resolve link'; 
If Succeeded(storage.Load(@widepath[1], STGM_READ)) Then 
If Succeeded(link.Resolve(GetActiveWindow, SLR_NOUPDATE)) Then 
If Succeeded(link.GetPath(buf, sizeof(buf), filedata, SLGP_UNCPRIORITY)) Then 
Result := buf; 
storage := nil; 
link:= nil; 
end; 
// 用法:  
procedure TForm1.Button1Click(Sender: TObject); 
begin 
ShowMessage(ResolveLink('C:\delphi 7.lnk')); 
end; 
end. 

implementation
uses activex,comobj,shlobj;
{$R *.dfm}
function ResolveLink(const ALinkfile: String): String;
var
link: IShellLink;
storage: IPersistFile;
filedata: TWin32FindData;
buf: Array[0..MAX_PATH] of Char;
widepath: WideString;
begin
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, link));
OleCheck(link.QueryInterface(IPersistFile, storage));
widepath := ALinkFile;
Result := 'unable to resolve link';
If Succeeded(storage.Load(@widepath[1], STGM_READ)) Then
If Succeeded(link.Resolve(GetActiveWindow, SLR_NOUPDATE)) Then
If Succeeded(link.GetPath(buf, sizeof(buf), filedata, SLGP_UNCPRIORITY)) Then
Result := buf;
storage := nil;
link:= nil;
end;
// 用法:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(ResolveLink('C:\delphi 7.lnk'));
end;
end.
 

发表评语
在Delphi中获取和修改文件的时间关键词:文件修改时间
本文介绍了在Delphi中利用系统函数和Windows API函数调用来获取和修改文件的时间信息的方法。
熟悉Windows 95/98的朋友一定经常会用单击鼠标右键的方法来查看所选定的文件的属性信息。在属性菜单中会列出该文件的创建时间、修改时间和访问时间。这些信息常常是很有用的,它们的设置一般都是由操作系统(也就是由Dos/Windows等等)自动完成的,不会让用户轻易修改。
这里,我向大家介绍在Delphi中如何实现文件时间的获取和修改方法。
Delphi中提供了很完备的Windows API函数的调用接口,可以方便的进行高级Windows编程。
利用Delphi中的FindFirst函数可以得到一个文件的属性记录,该记录中的FindData域中就记载了详细的文件时间信息。
然而遗憾的是,FindData中的时间信息是不能直接得到的。因此,有人(编者按:很遗憾不知此人姓名)
编写了一个转换函数来完成文件时间格式的转换。下面给出了具体的实现方法,仅供参考:
function CovFileDate(Fd:_FileTime):TDateTime;
{ 转换文件的时间格式 }
var
Tct:_SystemTime;
Temp:_FileTime;
begin
FileTimeToLocalFileTime(Fd,Temp);
FileTimeToSystemTime(Temp,Tct);
CovFileDate:=SystemTimeToDateTime(Tct);
end;
有了上面的函数支持,我们就可以获取一个文件的时间信息了。以下是一个简单的例子:
procdeure GetFileTime(const Tf:string);
{ 获取文件时间,Tf表示目标文件路径和名称 }
const
Model=yyyy/mm/dd,hh:mm:ss; { 设定时间格式 }
var
Tp:TSearchRec; { 申明Tp为一个查找记录 }
T1,T2,T3:string;
begin
FindFirst(Tf,faAnyFile,Tp); { 查找目标文件 } T1:=FormatDateTime(Model,
CovFileDate(Tp.FindData.ftCreationTime)));
{ 返回文件的创建时间 }
T2:=FormatDateTime(Model,
CovFileDate(Tp.FindData.ftLastWriteTime)));
{ 返回文件的修改时间 }
T3:=FormatDateTime(Model,Now));
{ 返回文件的当前访问时间 }
FindClose(Tp);
end;
设置文件的时间要复杂一些,这里介绍利用Delphi中的DataTimePicker组件来辅助完成这一复杂的操作。
 
下面的例子利用了四个DataTimePicker组件来完成文件创建时间和修改时间的设置。注意:文件的访问时间用修改时间来代替。使用下面的例子时,请在您的Form上添加四个DataTimePicker组件。
其中第一和第三个DataTimePicker组件中的Kind设置为dtkDate,第二个和第四个DataTimePicker组件中的Kind设置为dtkTime.
[delphi] view plaincopyprint?procedure SetFileDateTime(const Tf:string);  
{ 设置文件时间,Tf表示目标文件路径和名称 }  
var  
Dt1,Dt2:Integer;  
Fs:TFileStream;  
Fct,Flt:TFileTime;  
begin  
Dt1:=DateTimeToFileDate(  
Trunc(Form1.DateTimePicker1.Date) + Frac(Form1.DateTimePicker2.Time));  
Dt2:=DateTimeToFileDate(  
Trunc(Form1.DateTimePicker3.Date) + Frac(Form1.DateTimePicker4.Time));  
{ 转换用户输入在DataTimePicker中的信息 }  
try  
FS := TFileStream.Create(Tf, fmOpenReadWrite);  
try  
if DosDateTimeToFileTime(LongRec(DT1).Hi, LongRec(DT1).Lo, Fct) and  
LocalFileTimeToFileTime(Fct, Fct) and  
DosDateTimeToFileTime(LongRec(DT2).Hi, LongRec(DT2).Lo, Flt) and  
LocalFileTimeToFileTime(Flt, Flt)  
then SetFileTime(FS.Handle,  
@Fct, @Flt, @Flt);  
{ 设置文件时间属性 }  
finally  
FS.Free;  
end;  
except  
MessageDlg(日期修改操作失败!,  
mtError, [mbOk], 0);  
{ 因为目标文件正在被使用等原因而导致失败 }  
end;  
end;  

procedure SetFileDateTime(const Tf:string);
{ 设置文件时间,Tf表示目标文件路径和名称 }
var
Dt1,Dt2:Integer;
Fs:TFileStream;
Fct,Flt:TFileTime;
begin
Dt1:=DateTimeToFileDate(
Trunc(Form1.DateTimePicker1.Date) + Frac(Form1.DateTimePicker2.Time));
Dt2:=DateTimeToFileDate(
Trunc(Form1.DateTimePicker3.Date) + Frac(Form1.DateTimePicker4.Time));
{ 转换用户输入在DataTimePicker中的信息 }
try
FS := TFileStream.Create(Tf, fmOpenReadWrite);
try
if DosDateTimeToFileTime(LongRec(DT1).Hi, LongRec(DT1).Lo, Fct) and
LocalFileTimeToFileTime(Fct, Fct) and
DosDateTimeToFileTime(LongRec(DT2).Hi, LongRec(DT2).Lo, Flt) and
LocalFileTimeToFileTime(Flt, Flt)
then SetFileTime(FS.Handle,
@Fct, @Flt, @Flt);
{ 设置文件时间属性 }
finally
FS.Free;
end;
except
MessageDlg(日期修改操作失败!,
mtError, [mbOk], 0);
{ 因为目标文件正在被使用等原因而导致失败 }
end;
end;


以上简单介绍了文件时间属性的修改方法,请注意:修改文件时间的范围是从公元1792年9月19日开始的,上限可以达到公元2999年或更高。另外,请不要将此技术用于破坏他人文件等非正当途径。
 
 
2006-2-16 19:24:44 修改文件的扩展名关键词:扩展名 ChangeFileExt
var
filename:String;
begin
  filename := 'abcd.html';
  filename := ChangeFileExt(filename, '');
  Edit1.Text:=filename;
end;

2006-2-16 19:25:32 如何读写文本文件关键词:读写文本文件
下面源代码或许对你有些帮助:
[delphi]
Procedure NewTxt; 
Var 
 F : Textfile; 
Begin 
 AssignFile(F, 'c:\ek.txt'); {将文件名与变量 F 关联} 
 ReWrite(F); {创建一个新的文件并命名为 ek.txt} 
 Writeln(F, '将您要写入的文本写入到一个 .txt 文件'); 
 Closefile(F); {关闭文件 F} 
End; 
Procedure OpenTxt; 
Var 
 F : Textfile; 

补充:软件开发 , Delphi ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,