2014-08-28 89 views
0

作爲我的應用程序的一部分,我需要讓用戶能夠從我的應用程序執行文件(視頻),但問題是應用程序不存儲這些文件的列表在應用程序本身的任何地方,關於該文件的唯一信息就是它所在的目錄,並且它必須與特定模式相匹配,如下所示:* - Ep[0-99] - *其中*字符表示任何字符串,整數,unicode字符等任何長度和Ep & -的是字符串文字和最後,[0-99]是任何整數值0之間和99使用模式作爲文件名執行文件

這聽起來像一個每但正則表達式的問題是正則表達式需要一個字符串來匹配,然後才能找到匹配,並且如前所述,應用程序不會將此字符串存儲在任何位置,因此使用RegEx將無法工作,除非我第一次使用像FindFirst函數來搜索文件所在的目錄,然後遍歷它,將每個文件名加載到RegEx可以匹配的變量中,但是我寧願避免這樣做,如果有更好的替代方法可用。

我也研究過MatchesMask函數來完成這個任務,但它也遇到了使用正則表達式的相同的問題,所以我會感謝一些建議或上面已經提到的方法的替代方法。

+1

不避免讀取文件名。您可以使用TDirectory.GetFiles而不是FindFirst/Next ..(它在內部使用FindFirst,..)。 – 2014-08-28 23:38:39

+1

'TDirectory.GetFiles()'迭代整個目錄,(低效地)分配,然後返回找到的文件名數組。直接調用'Find(First | Next)()'可以在迭代時處理文件名。所以這取決於你需要怎麼處理這些文件,存在多少文件,你願意使用多少內存等等。設計'System.IOUtils'單元的人沒有做很好的工作。 – 2014-08-29 00:06:12

+0

是的,TDirectory.GetFiles使用起來有點方便(雖然它使用討厭的TStringDynArray,但是)perf是可怕的。任何資深的程序員都會在實施時退縮,所以大概Emba的代碼審查政策是鬆懈的。 – 2014-08-29 05:57:17

回答

1

有沒有遠離列舉目錄的內容。如果你必須避免這種情況,出於未知的原因,那麼你唯一剩下的選擇就是猜測文件名。如果你想找到它們,那麼你需要嘗試每個可能的文件名,以匹配你的模式。這是不容易處理的。有太多了。

這將我們帶回FindFirst或其他一些目錄枚舉方案。我個人會直接使用FindFirst。這很簡單,高效。在僞代碼中:

retval := FindFirst(TPath.Combine(dir, '*'), 
    faAnyFile and not faDirectory, searchRec); 
if retval = 0 then 
    try 
    repeat 
     filename := TPath.Combine(dir, searchRec.Name); 
     if MatchesRegex(filename) then 
     DoStuff(filename); 
    until FindNext(searchRec) <> 0; 
    finally 
    FindClose(searchRec); 
    end; 
+0

當應用程序首先開始創建匹配文件列表時,然後爲目錄的更改(如正在添加/刪除或重命名的文件)設置通知並評估是否需要修改列表時,可以執行此處理。關於changenotification的MSDN:http://msdn.microsoft.com/en-us/library/bb762120.aspx,如果您安裝了JVCL:http://wiki.delphi-jedi.org/wiki/JVCL_Help:JvChangeNotify.pas或你可以使用這個組件:http://www.cromis.net/blog/downloads/directory-watch/ – 2014-08-29 17:26:48

+0

@user如果你信任變更通知,這是不可靠的 – 2014-08-29 17:31:33

+0

不能說變更通知的可靠性,可以說我使用它,從來沒有任何問題。 – 2014-08-29 17:46:56