我有一个包含14.000个文件的目录。每天将20-50个文件添加到此目录中。
我想对放在此目录中的所有新文件执行操作,我只希望每个文件执行一次此操作。
我已经做了一个rutine并且它有效,但它真的很糟糕。
它是这样的:
这是no的代码。 3:
for i := 0 to FileListDir.Items.Count - 1 do
if FileListHandled.Items.IndexOf(FileListDir.Items[i]) = -1 then
FilesNeedHandling.Items.Add(FileListDir.Items[i]);
rutine需要大约30-35秒才能完成。
2个问题:
答案 0 :(得分:0)
“find”命令可用于此目的。
find <path of directory> -mtime -1 -print
这将打印过去一天内在给定目录下修改的文件
find <path of directory> -mtime -1 -exec <command> {} \;
这会查找过去一天内修改过的文件,并在每个文件上运行给定的命令
find <path of directory> -mmin -60 -exec <command> {} \;
它处理在过去60分钟内修改过的文件。
答案 1 :(得分:0)
好的,这不是Phyton而是Delphi(标签被删除了吗?)
我不得不再次重新考虑这一切。这次我成功了。
我写了自己的rutine来将文件加载到列表框中并对其进行冒泡排序。 之后,我可以提取未处理的文件名。
测试场景:4628个文件
测试分析如下:
将文件列表加载到: TFileListBox时间:2,24 TFileListBoxEx时间:1,52 TJvFileListBox时间:59,28(Wtf是否与Jvl libralies有关?)
拥有rutine来加载带有日期时间信息和冒泡排序的文件到: TListBox时间:1,61
// Get files list
if FindFirst(C_MailIncomingDir+'\*.eml', faAnyFile, Rec) = 0 then
repeat
Setlength(FileList, Length(FileList) + 1);
Setlength(DateList, Length(DateList) + 1);
FileList[High(FileList)]:= Rec.Name;
DateList[High(DateList)]:= FileDateToDateTime(Rec.Time);
until FindNext(Rec) <> 0;
FindClose(Rec);
// Sort
// Bubble sort
repeat
Done:= True;
for i:= 0 to High(FileList) - 1 do
if DateList[i] > DateList[i + 1] then
begin
Done:= False;
TempName:= FileList[i];
FileList[i]:= FileList[i + 1];
FileList[i + 1]:= TempName;
TempDate:= DateList[i];
DateList[i]:= DateList[i + 1];
DateList[i + 1]:= TempDate;
end;
until Done;
// Show in list
FilesInDir.Clear;
for i:= 0 to High(FileList) do
FilesInDir.Items.Add(FileList[i] + ' ' + DateTimeToStr(DateList[i]));
通过按日期时间对文件进行排序,可以将所有尚未使用此行处理过的文件区分开来(对于4500个文件,为0,06而不是10秒):
for I := FileListHandled.Count to FilesInDir.Count-1 do
FilesNeedHandling.Items.Add(FilesInDir.Items[i]);