Delphi 文件处理实例(6)

本文深入探讨了Delphi编程中文件处理的各种实践案例,包括读写操作、文件流使用及高级文件管理技巧,旨在帮助开发者提升在Delphi环境下进行文件操作的能力。
摘要由CSDN通过智能技术生成
取得该快捷方式的指向EXE
关键词:快捷方式 LNK
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.
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 如何读写文本文件关键词:读写文本文件
下面源代码或许对你有些帮助:
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;
Begin
 AssignFile(F, 'c:\ek.txt'); {将文件名与变量 F 关联}
 Append(F); {以编辑方式打开文件 F }
 Writeln(F, '将您要写入的文本写入到一个 .txt 文件');
 Closefile(F); {关闭文件 F}
End;
Procedure ReadTxt;
Var
 F : Textfile;
 str : String;
Begin
 AssignFile(F, 'c:\ek.txt'); {将文件名与变量 F 关联}
 Reset(F); {打开并读取文件 F }
 Readln(F, str);
 ShowMessage('文件有:' +str + '行。');
 Closefile(F); {关闭文件 F}
End;


2006-2-16 19:25:57 删除某目录下所有指定扩展名文件关键词:删除文件 扩展名
//删除某目录下所有指定扩展名文件
function DelFile(sDir,fExt: string): Boolean;
var
hFindfile: HWND;
FindFileData: WIN32_FIND_DATA;
sr: TSearchRec;
begin
sDir:= sDir + '\';
hFindfile:= FindFirstFile(pchar(sDir + fExt), FindFileData);
if hFindFile <> NULL then
begin
deletefile(sDir + FindFileData.cFileName);
while FindNextFile(hFindFile, FindFileData) <> FALSE do
deletefile(sDir + FindFileData.cFileName);
end;
sr.FindHandle:= hFindFile;
FindClose(sr);
end;
function getAppPath : string;
var
strTmp : string;
begin
strTmp := ExtractFilePath(ExtractFilePath(application.Exename));
if strTmp[length(strTmp)] <> '\' then
strTmp := strTmp + '\';
result := strTmp;
end; 

 
2006-2-16 19:26:41 把音频插进EXE文件并且播放关键词:资源文件
步骤1)建立一个SOUNDS.RC文件
使用NotePad记事本-象下面:
#define WAVE WAVEFILE
SOUND1 WAVE "anysound.wav"
SOUND2 WAVE "anthersound.wav"
SOUND3 WAVE "hello.wav"

步骤2)把它编译到一个RES文件
使用和Delphi一起的BRCC32.EXE程序。使用下面的命令行:
BRCC32.EXE -foSOUND32.RES SOUNDS.RC
你应该以'sound32.res'结束一个文件。

步骤3)把它加入你的程序
在DPR文件把它加入{$R*.RES}下面,如下:
{$R SOUND32.RES}

步骤4)把下面的代码加入程序去播放内含的音频
USES MMSYSTEM 
Procedure PlayResSound(RESName:String;uFlags:Integer); 
var 
hResInfo,hRes:Thandle; 
lpGlob:Pchar; 
Begin
hResInfo:=FindResource(HInstance,PChar(RESName),MAKEINTRESOURCE('WAVEFILE'));
if hResInfo = 0 then
begin
messagebox(0,'未找到资源。',PChar(RESName),16);
exit;
end;
hRes:=LoadResource(HInstance,hResinfo);
if hRes = 0 then
begin
messagebox(0,'不能装载资源。',PChar(RESName),16);
exit;
end;
lpGlob:=LockResource(hRes);
if lpGlob=Nil then
begin
messagebox(0,'资源损坏。',PChar(RESName),16);
exit;
end;
uFlags:=snd_Memory or uFlags;
SndPlaySound(lpGlob,uFlags);
UnlockResource(hRes);
FreeResource(hRes); 
End; 


步骤5)调用程序,用你在步骤(1)编译的声音文件名。
PlayResSound('SOUND1',SND_ASYNC)
Flags are:
SND_ASYNC = Start playing, and don't wait to return
SND_SYNC = Start playing, and wait for the sound to finish
SND_LOOP = Keep looping the sound until another sound is played

2006-2-16 19:27:29 delphi如何修改文件的时间关键词:文件创建时间 最后修改时间 最后访问时间
在windows下,属性里面有三个日起,创建,修改,存储。我怎么来修改啊?
代码如下:
type
// indicates the file time to set, used by SetFileTimesHelper and SetDirTimesHelper
TFileTimes = (ftLastAccess, ftLastWrite, ftCreation);
function SetFileTimesHelper(const FileName: string; const DateTime: TDateTime; Times: TFileTimes): Boolean;
var
Handle: THandle;
FileTime: TFileTime;
SystemTime: TSystemTime;
begin
Result := False;
Handle := CreateFile(PChar(FileName), GENERIC_WRITE, FILE_SHARE_READ, nil,
OPEN_EXISTING, 0, 0);
if Handle <> INVALID_HANDLE_VALUE then
try
//SysUtils.DateTimeToSystemTime(DateTimeToLocalDateTime(DateTime), SystemTime);
SysUtils.DateTimeToSystemTime(DateTime, SystemTime);
if Windows.SystemTimeToFileTime(SystemTime, FileTime) then
begin
case Times of
ftLastAccess:
Result := SetFileTime(Handle, nil, @FileTime, nil);
ftLastWrite:
Result := SetFileTime(Handle, nil, nil, @FileTime);
ftCreation:
Result := SetFileTime(Handle, @FileTime, nil, nil);
end;
end;
finally
CloseHandle(Handle);
end;
end;
//------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值