सबसे पहले, मेरी गरीब अंग्रेज़ी माफ अनन्य ..., संपूर्ण क्वेरी के अंत से पहले पहला परिणाम प्राप्त करें।
यहाँ और वहाँ वेब पर पाया विभिन्न उदाहरणों की मदद से
, मैं अंत में इस विधि लिखें:
public static IEnumerable<FileInfo> EnumerateFiles_Recursive(this DirectoryInfo directory, string searchPattern, SearchOption searchOption, Func<DirectoryInfo, Exception, bool> handleExceptionAccess)
{
Queue<DirectoryInfo> subDirectories = new Queue<DirectoryInfo>();
IEnumerable<FileSystemInfo> entries = null;
// Try to get an enumerator on fileSystemInfos of directory
try
{
entries = directory.EnumerateFileSystemInfos(searchPattern, SearchOption.TopDirectoryOnly);
}
catch (Exception e)
{
// If there's a callback delegate and this delegate return true, we don't throw the exception
if (handleExceptionAccess == null || !handleExceptionAccess(directory, e))
throw;
// If the exception wasn't throw, we make entries reference an empty collection
entries = EmptyFileSystemInfos;
}
// Yield return file entries of the directory and enqueue the subdirectories
foreach (FileSystemInfo entrie in entries)
{
if (entrie is FileInfo)
yield return (FileInfo)entrie;
else if (entrie is DirectoryInfo)
subDirectories.Enqueue((DirectoryInfo)entrie);
}
// If recursive search, we make recursive call on the method to yield return entries of the subdirectories.
if (searchOption == SearchOption.AllDirectories)
{
DirectoryInfo subDir = null;
while (subDirectories.Count > 0)
{
subDir = subDirectories.Dequeue();
foreach (FileInfo file in subDir.EnumerateFiles_Recursive(searchPattern, searchOption, handleExceptionAccess))
{
yield return file;
}
}
}
else
subDirectories.Clear();
}
मैं एक पंक्ति और एक पुनरावर्ती विधि का उपयोग पारंपरिक क्रम (निर्देशिका और फिर सामग्री की सामग्री को रखने के लिए पहली उपनिर्देशिका और अपनी उपनिर्देशिकाओं और फिर दूसरी सामग्री की सामग्री ...)। "HandleExceptionAccess" पैरामीटर केवल एक फ़ंक्शन कॉल है जब किसी अपवाद को निर्देशिका के साथ फेंक दिया जाता है; फ़ंक्शन को यह इंगित करने के लिए सत्य वापस करना होगा कि अपवाद को अनदेखा किया जाना चाहिए।
इस methode के साथ
, आप लिख सकते हैं:
DirectoryInfo dir = new DirectoryInfo("c:\\temp");
long size = dir.EnumerateFiles_Recursive("*", SearchOption.AllDirectories, (d, ex) => true).Sum(f => f.Length);
और यहाँ हम कर रहे हैं: सभी अपवाद है जब एक निर्देशिका की गणना करने में उपेक्षा हो जाएगा कोशिश कर रहा!
आशा इस मदद
लियोनेल
पुनश्च: एक कारण मैं व्याख्या नहीं कर सकते के लिए, मेरे विधि ढांचे 4 एक से अधिक तेज है ...
पी पी एस: यदि आप प्राप्त कर सकते हैं मेरे उन विधियों के स्रोत के साथ परीक्षण समाधान: यहां TestDirEnumerate। मैं EnumerateFiles_Recursive लिखता हूं, EnumerateFiles_NonRecursive (रिकर्सन से बचने के लिए कतार का उपयोग करें) और EnumerateFiles_NonRecursive_TraditionalOrder (रिकर्सन से बचने और पारंपरिक ऑर्डर रखने के लिए कतार के ढेर का उपयोग करें)। उन 3 विधियों को कोई दिलचस्पी नहीं है, मैं उन्हें केवल सर्वश्रेष्ठ परीक्षण के लिए लिखता हूं। मुझे लगता है कि केवल अंतिम ही रखना है। मैंने EnumerateFileSystemInfos और EnumerateDirectories के समकक्ष भी लिखा है।
पिछले कोड लाइन पर कि :) – ThePower