2012-10-04 12 views
6

TDirectory.GetFiles में SearchPattern नामक एक पैरामीटर है। Embarcadero का प्रलेखनTDirectory.GetFiles पर एकाधिक फ़ाइल एक्सटेंशन कैसे पास करें?

फ़ाइल नामों से मिलान करते समय मुखौटा का उपयोग किया जाता है (उदाहरण के लिए, "* .exe" सभी निष्पादन योग्य फ़ाइलों से मेल खाता है)।

हालांकि, मैं एकाधिक फ़ाइल प्रकारों को पास करना चाहता हूं। मुझे उन प्रकारों को FilterComboBox.Mask से मिलता है। तो, यह एक स्ट्रिंग है जो '*.txt;*.rtf;*.doc' जैसा दिखता है।

मैंने उस स्ट्रिंग को सीधे GetFiles पर पारित करने का प्रयास किया है और यह काम नहीं करता है। क्या मुझे इसे पार्स करना है, इसे टुकड़ों में तोड़ना है और प्रत्येक व्यक्तिगत टुकड़े को GetFiles पर फ़ीड करना है?

उत्तर

11

GetFiles के पीछे आरटीएल कोड Masks.MatchesMask पर आपके खोज पैटर्न के लिए एक मैच के लिए परीक्षण करने के लिए कॉल करता है। यह फ़ंक्शन केवल एक मुखौटा के खिलाफ मास्किंग का समर्थन करता है।

विकल्प अधिभार का उपयोग करना है जो TFilterPredicate स्वीकार करता है। आप एक अनुमान लगाते हैं कि यह जांच करता है कि कोई नाम आपके पैटर्न से मेल खाता है या नहीं।

uses 
    StrUtils, Types, Masks, IOUtils; 

function MyGetFiles(const Path, Masks: string): TStringDynArray; 
var 
    MaskArray: TStringDynArray; 
    Predicate: TDirectory.TFilterPredicate; 
begin 
    MaskArray := SplitString(Masks, ';'); 
    Predicate := 
    function(const Path: string; const SearchRec: TSearchRec): Boolean 
    var 
     Mask: string; 
    begin 
     for Mask in MaskArray do 
     if MatchesMask(SearchRec.Name, Mask) then 
      exit(True); 
     exit(False); 
    end; 
    Result := TDirectory.GetFiles(Path, Predicate); 
end; 

ध्यान दें कि MatchesMask बनाता है और नष्ट कर देता है एक ढेर TMask हर बार यह कहा जाता है आवंटित करें। मैं अच्छी तरह से कल्पना कर सकता हूं कि एक लंबी खोज पर एक प्रदर्शन बाधा है। इस मामले में आप से TMask ऑब्जेक्ट्स की सरणी बना सकते हैं। और परीक्षण करने के लिए भविष्यवाणी में उन लोगों का उपयोग करें। मुझे नहीं पता कि यह एक वैध चिंता है या नहीं, कोड को समझते समय मेरे साथ कुछ ऐसा हुआ।

+0

अच्छा एक। +1 यह ब्रेक की तरह होता है जब नाम में अर्ध-कॉलन वाली फाइलों का उपयोग किया जाता है, लेकिन यह इस दिनचर्या की गलती नहीं है। मैंने कभी नहीं समझा कि उन्होंने मास्क को अलग करने के लिए पाइप की तरह कुछ क्यों नहीं इस्तेमाल किया। –

+0

हाँ, जाहिर है आप अवैध फ़ाइल नाम वर्णों में से एक से अपने सीईपी चार का चयन कर सकते हैं –

+0

धन्यवाद। मैं भविष्यवाणी के बारे में जानता हूँ। मैं बस यह सुनिश्चित करना चाहता था कि वास्तव में कोई ऐसा फ़ंक्शन नहीं है जो एकाधिक फ़ाइल प्रकारों का सीधे समर्थन करता हो। – Ampere

संबंधित मुद्दे