2015-10-31 118 views
0

我有一个包含14.000个文件的目录。这个目录每天会添加20-50个文件。对目录中的每个新文件执行操作

我想对放置在这个目录中的所有新文件执行一个操作,我只希望这个操作在每个文件中执行一次。

我已经做了一个芦丁,它的工作原理,但它真的很烂。

它是这样的:

  1. 获取direcroty所有文件到列表框
  2. 所有处理过的文件加载文本文件到另一个列表框
  3. 比较列表框,并提取所有新文件。
  4. 对新文件执行操作。
  5. 保存所有处理文件的文本文件。

这是代码没有。 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]); 

芦苇大约需要30-35秒才能完成。

2个问题:

  1. 我怎样才能让我的rutine更快?
  2. 在不使用我的rutine的情况下,可以只获取目录中的“新”文件。

回答

0

“查找”命令可用于此目的。

find <path of directory> -mtime -1 -print 

将打印出过去的一天

find <path of directory> -mtime -1 -exec <command> {} \; 

这个发现在过去的一天之内修改的文件,并运行在每个文件指定的命令中指定的目录下,修改后的文件

find <path of directory> -mmin -60 -exec <command> {} \; 

这处理在最近60分钟内修改的文件。

+0

我有这个想法。 –

+0

如果你运行这个,每小时说一次,你可以通过选项“-mmin -60”找到在最近60分钟内修改的所有文件。我认为这应该涵盖所有文件。 –

+0

如果程序在一个周末崩溃,将会有一段时间的差距,并且还会有文件将被处理多次的风险(这就是为什么我将处理后的文件名保存到文本文件) –

0

好了,这是不是植酮,但德尔福(的标签已被移除?)

我不得不重新思考这一切,再一次。这一次我收获了。

我写了自己的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])); 

通过由日期时间排序的文件,有可能diff的出尚未处理的所有文件用这一行(0,06而不是10秒为4500个文件):

for I := FileListHandled.Count to FilesInDir.Count-1 do 
    FilesNeedHandling.Items.Add(FilesInDir.Items[i]); 
相关问题