2011-02-12 12 views
6

मैं की तरह What is the best way to empty a directory?निर्देशिका में फ़ाइलों को हटाने का सबसे तेज़ तरीका क्या है? (विशिष्ट फ़ाइल एक्सटेंशन को छोड़कर)

सवाल को देखा है लेकिन मैं जानना चाहते हैं,

क्या मिला किसी भी .zip फ़ाइलों को छोड़कर सभी निर्देशिका के भीतर पाया फ़ाइलें हटाकर का सबसे तेज़ तरीका है।

यहां linq की तरह बदबू आ रही है ... या क्या?

सबसे तेज़ तरीका कहकर, मेरा मतलब सबसे तेज़ निष्पादन समय है।

+0

आप इसमें कौन सी भाषा/ओएस कर रहे हैं? – Eli

+0

मुझे लगता है कि सी #/LINQ टैग पर्याप्त हैं @Eli – Marko

+0

LINQ किसी भी अन्य विधि की तुलना में तेज़ नहीं होगा; इसे अभी भी फाइलों को किसी भी तरह से गिनना है। बाधा आपकी डिस्क है, अनुरोध भेजने के लिए जिम्मेदार कोड नहीं है। –

उत्तर

2

यहाँ सादे पुराने सी #

foreach(string file in Directory.GetFiles(Server.MapPath("~/yourdirectory"))) 
{ 
    if(Path.GetExtension(file) != ".zip") 
    { 
     File.Delete(file); 
    } 
} 

और यहाँ LINQ

var files = from f in Directory.GetFiles("") 
      where Path.GetExtension(f) != ".zip" 
      select f; 

foreach(string file in files) 
    File.Delete(file); 
8

सबसे तेजी से है आप कोड की कम से कम लाइनों या तेज निष्पादन समय के लिए पूछ रहे हैं? प्रत्येक लूप के लिए उन्हें समान रूप से हटाने के लिए समानांतर के साथ LINQ का उपयोग करके एक नमूना दिया गया है।

string[] files = System.IO.Directory.GetFiles("c:\\temp", "*.*", IO.SearchOption.TopDirectoryOnly); 

List<string> del = (
    from string s in files 
    where ! (s.EndsWith(".zip")) 
    select s).ToList(); 

Parallel.ForEach(del, (string s) => { IO.File.Delete(s); }); 
+2

PLINQ के लिए +1 ... – Marko

+0

इसका उल्लेख करने के लिए खेद है। मेरा मतलब सबसे तेज़ निष्पादन समय – GeorgeBoy

+0

+1 पहले कभी PLINQ भर में नहीं चला। प्रति दिन कुछ नया सीखें। – stoj

8

यदि आप .NET 4 का उपयोग कर रहे हैं तो आप स्मार्ट तरीके से लाभ उठा सकते हैं .NET अब आपके कार्यों को लंबित कर रहा है। यह कोड इसे करने का सबसे तेज़ तरीका है। यह प्रोसेसर पर भी आपके कोर के साथ स्केल करता है।

 DirectoryInfo di = new DirectoryInfo(yourDir); 
     var files = di.GetFiles(); 

     files.AsParallel().Where(f => f.Extension != ".zip").ForAll((f) => f.Delete()); 
3
पिछले जवाब इस्तेमाल किया Directory.EnumerateFiles() जो है, जबकि सूची का निर्माण किया जा रहा है आप फ़ाइलों की सूची पर कार्रवाई पर ले जाने के लिए अनुमति देता है के इस जवाब से कोई भी लिखने के समय

। कोड:

Parallel.ForEach(Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories).AsParallel(), Item => 
     { 
      if(!string.Equals(Path.GetExtension(Item), ".zip",StringComparison.OrdinalIgnoreCase)) 
       File.Delete(Item); 
     }); 

जहां तक ​​मैं AsParallel का उपयोग करने से प्रदर्शन लाभ पता है() महत्वपूर्ण नहीं होना चाहिए (यदि पाया जाता है) इस मामले में हालांकि यह मेरे मामले में फर्क किया था।

मैंने 4689 फाइलों की सूची में सभी .zip फ़ाइलों को हटाने के लिए जितना समय निकाला है, उनमें से 10 की तुलना में ज़िप फाइलें थीं। 2-समानांतर foreach। 3-IEnumerable()। AsParallel()। Forall। आईन्यूमेरेबल()। AsParallel() का उपयोग करके 4-समांतर फोरैच ऊपर दिखाए गए अनुसार। परिणाम:

1-1545

2-1015

3-1103

4-839

पांचवें और आखिरी मामला एक सामान्य foreach Directory.GetFiles का उपयोग कर (था)

5-2266

बेशक परिणाम निर्णायक नहीं थे, जहां तक ​​मुझे उचित बेंचमार्किंग करने के बारे में पता है, आपको एचडीडी की बजाय रैम ड्राइव का उपयोग करने की आवश्यकता है।

नोट: कि एन्युमेरेटफाइल और गेटफाइल के बीच प्रदर्शन अंतर अधिक स्पष्ट हो जाता है क्योंकि फाइलों की संख्या बढ़ जाती है।

+1

एमएस में समय क्या हैं? वैसे भी, वास्तव में * इसका परीक्षण करने और प्रदर्शन मतभेदों को दस्तावेज करने के लिए धन्यवाद !!! –

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

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