如何读取一个目录下所有文件(100分)

  • 主题发起人 主题发起人 jsq
  • 开始时间 开始时间
J

jsq

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,如何读取一个目录下的文件,然后在listview显示。
包括文件名、文件大小、文件建立日期,谢谢
 
给出几个与文件时间相关的函数,供参考:
// 取得文件创建时间
function GetFileCreationTime(const FileName: String): TDateTime;
var
FileTime: TFileTime;
LocalFileTime: TFileTime;
hFile: THandle;
SystemTime: TSystemTime;
begin
Result := 0;
FileTime.dwLowDateTime := 0;
FileTime.dwHighDateTime := 0;
hFile := FileOpen(FileName, fmShareDenyNone);
try
if hFile <> 0 then
begin
Windows.GetFileTime(hFile, @FileTime, nil, nil);
FileTimeToLocalFileTime(FileTime, LocalFileTime);
FileTime := LocalFileTime;
end;
finally
FileClose(hFile);
end;
if FileTimeToSystemTime(FileTime, SystemTime) then
Result := SystemTimeToDateTime(SystemTime);
end;

// 取得文件修改时间
function GetFileLastWriteTime(const FileName: String): TDateTime;
var
FileTime: TFileTime;
LocalFileTime: TFileTime;
hFile: THandle;
SystemTime: TSystemTime;
begin
Result := 0;
FileTime.dwLowDateTime := 0;
FileTime.dwHighDateTime := 0;
hFile := FileOpen(FileName, fmShareDenyNone);
try
if hFile <> 0 then
begin
Windows.GetFileTime(hFile, nil, nil, @FileTime);
FileTimeToLocalFileTime(FileTime, LocalFileTime);
FileTime := LocalFileTime;
end;
finally
FileClose(hFile);
end;
if FileTimeToSystemTime(FileTime, SystemTime) then
Result := SystemTimeToDateTime(SystemTime);
end;

// 取得文件访问时间
function GetFileLastAccessTime(const FileName: String): TDateTime;
var
FileTime: TFileTime;
LocalFileTime: TFileTime;
hFile: THandle;
SystemTime: TSystemTime;
begin
Result := 0;
FileTime.dwLowDateTime := 0;
FileTime.dwHighDateTime := 0;
hFile := FileOpen(FileName, fmShareDenyNone);
try
if hFile <> 0 then
begin
Windows.GetFileTime(hFile, nil, @FileTime, nil);
FileTimeToLocalFileTime(FileTime, LocalFileTime);
FileTime := LocalFileTime;
end;
finally
FileClose(hFile);
end;
if FileTimeToSystemTime(FileTime, SystemTime) then
Result := SystemTimeToDateTime(SystemTime);
end;
 
看看Delphi/Demos/的例子。
 
SHGetFileInfo
 
使用FindFirst,FIndNext,
var Found:Integer;
SearchREc:TSearchrec;
begin
Found:=FIndFirst(目录+/'*.*',faArchive,SearchRec)
while found=0do
begin
do
what you want todo
;
FindNext(SearchREc);
end;
findClose(SearchREc);
TSearchREc:有你要的所有属性包括name,size等
 
我自己函数库里的一个函数:
function GetFileList(path:string;Attr:integer;FileList:TStringList):boolean;
var
SearchRec: TSearchRec;
i:integer;
begin
i:=FindFirst(path, attr, SearchRec);
if i <> 0 then
begin
result := false;
exit;
end;

while i = 0do
begin
FileList.Add(SearchRec.Name);
i:=FindNext(SearchRec);
end;
FindClose(SearchRec);
result := true;
end;

使用范例:
var
FileList:Tstringlist;
begin
filelist := Tstringlist.Create;
getfilelist(ExtractFilePath(Application.ExeName)+'*.dat',faAnyFile,filelist);//寻找程序所在目录下的所有*.dat文件
//do something with filelist
filelist.free;
end;

具体到每一个文件的属性,你可以自己修改getfilelist函数,
从TSearchRec结构里获得
TSearchRec的结构:
TSearchRec = record
Time: Integer;//Time contains the time stamp of the file.
Size: Integer;//Size contains the size of the file in bytes.
Attr: Integer;//Attr represents the file attributes of the file.
Name: TFileName;//Name contains thedo
S filename and extension.
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;//FindData contains additional information such as
//file creation time, last access time, long and short filenames.
end;

再不懂可以看Delphi的help。
够了么?
 
是否要找文件包含子目录的文件,如果是的话:
1.先将目录设置到需要查询目录;
2.调用FindFirstFile,查询所有的文件
3.通过win32_find_data得到查询信息,如果目录,保存到buffer中;如果是文件,也可从中得到文件名,大小以及创建时间;
4.调用FindNextFile,查询下一个文件,如果返回不为0,执行3;
5.通过FindClose结束查询,不此目录从buffer中清除(如果是根目录则不需);
6.如果buffer,不为空,设置查询目录,执行2;否则,结束.
 
多人接受答案了。
 
后退
顶部