2015-10-31 114 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]); 
相關問題