2012-03-06 19 views
9

जब मैं कुछ फ़ोल्डरों और फ़ाइलों के माध्यम से पुनरावृत्ति करता हूं, तो मुझे यह त्रुटि आती है:सी # DirectoryInfo का उपयोग करते समय मैं सीमाओं को कैसे हल कर सकता हूं?

निर्दिष्ट पथ, फ़ाइल नाम, या दोनों बहुत लंबे हैं। पूरी तरह से योग्य फ़ाइल नाम 260 वर्णों से कम होना चाहिए, और निर्देशिका नाम 248 वर्णों से कम होना चाहिए।

यहाँ

private void ProcessDirectory(DirectoryInfo di) 
{ 
    try 
    { 
     DirectoryInfo[] diArr = di.GetDirectories(); 

     foreach (DirectoryInfo directoryInfo in diArr) 
     { 
      if (StopCheck) 
        return; 
      ProcessDirectory(directoryInfo); 
     } 
     ProcessFile(di); 
    } 
    catch (Exception e) 
    { 
     listBoxError.Items.Add(e.Message); 
    } 

    TextBoxCurrentFolder.Text = di.ToString(); 
} 

मुझे लगता है मैं इस समस्या को कैसे हल कर सकते हैं निर्देशिका नाम छोटा है, क्योंकि मैं भी तो अनुमति नहीं कर रहा हूँ नहीं कर सकता ... मेरी समारोह है?

जोड़ा गया:

private void ProcessFile(DirectoryInfo di) 
{ 
    try 
    { 
     FileInfo[] fileInfo = di.GetFiles(); 

     if (fileInfo.LongLength != 0) 
     { 
      foreach (FileInfo info in fileInfo) 
      { 
       Size += info.Length; 
       CountFile++; 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     listBoxError.Items.Add(e.Message); 
    } 
} 

संपादित इस मिला जहां उन्होंने जीटा लांग पथ प्रयोग किया है:: यहाँ अन्य समारोह है How can I use FileInfo class, avoiding PathTooLongException?

इसे लागू किया है और अब मैं जा रहा हूँ कार्यक्रम को रात को चलाने के लिए यह देखने के लिए कि यह काम करता है या नहीं।

EDIT कल जेतालोंगपाथ का इस्तेमाल किया और यह बहुत अच्छा काम किया! यह फ़ोल्डर्स के माध्यम से भी चला गया जिसके लिए अनुमति पहुंच की आवश्यकता थी।

संपादित zetalongPath के बजाय , मैं Delimon.Win32.IO.dll जो मुझे लगता है कि बेहतर है का उपयोग किया है। Win32 के रूप में यह वही इंटरफेस है।

+0

मैं आप सादे Windows API के लिए वापस जाने के लिए है लगता है (FindFirst */FindNext *) –

+0

तो त्रुटि 'ProcessFile के भीतर से होती है()', हो सकता है कि कोड कर सकते हैं अगर हम इसे देख सकते हैं तो बदला जा सकता है? – musefan

+0

क्या आप जानते हैं कि फाइलों को संसाधित करने से पहले आप सबसे गहरे सबफ़ोल्डर के लिए सबसे पहले हैं ?! यदि आप रूटफॉल्डर से प्रारंभ करना चाहते हैं तो आपको विधि की शुरुआत में 'ProcessFile (di);' ले जाना चाहिए। –

उत्तर

8

यहां उल्लिखित डेलीमॉन लाइब्रेरी के बारे में अधिक जानकारी दी गई है। लंबे फ़ाइल नामों पर काबू पाने के लिए माइक्रोसॉफ्ट टेकनेट पर इसकी .NET Framework 4 आधारित लाइब्रेरी:

Delimon.Win32.I​O Library (V4.0)

इसमें सिस्टम.आईओ से महत्वपूर्ण विधियों के अपने संस्करण हैं। उदाहरण के लिए, आप की जगह लेंगे:

System.IO.Directory.GetFiles 

साथ
Delimon.Win32.IO.Directory.GetFiles 

जो आप लंबे समय फ़ाइलों और फ़ोल्डरों संभाल करने देगा।

वेबसाइट से:

Delimon.Win32.IO replaces basic file functions of System.IO and supports File & Folder names up to up to 32,767 Characters.

This Library is written on .NET Framework 4.0 and can be used either on x86 & x64 systems. The File & Folder limitations of the standard System.IO namespace can work with files that have 260 characters in a filename and 240 characters in a folder name (MAX_PATH is usually configured as 260 characters). Typically you run into the System.IO.PathTooLongException Error with the Standard .NET Library.

+0

अल्फाफेस नामक एक और संभावित विकल्प है: https://github.com/alphaleonis/AlphaFS – TripleAntigen

1

यह विंडोज में एक ज्ञात सीमा है: http://msdn.microsoft.com/en-us/library/aa365247.aspx

मैं नहीं मानता कि आप इसे चारों ओर पाने के लिए सक्षम हो जाएगा, तो जो कोई भी आप कह रहा है कि आप उन्हें कम करने के लिए अनुमति नहीं है, तो आप ' आपको एक ठोस ठोस तर्क होगा कि आपको क्यों करना है।

एकमात्र वास्तविक विकल्प कहीं और गहरे फ़ोल्डर को स्थानांतरित करना है, शायद आपके ड्राइव की जड़ पर।

संपादित करें: http://www.codinghorror.com/blog/2006/11/filesystem-paths-how-long-is-too-long.html

1

आप subst आदेश का उपयोग कर सकते हैं: असल में वहाँ एक समाधान हो सकता है। यह पैरामीटर के रूप में आपके द्वारा पारित किए गए फ़ोल्डर पर शुरू होने वाला वर्चुअल ड्राइव बनाता है। ड्राइव आर में \ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa:

उदाहरण के लिए, आप बदल सकते हैं पथ सी और सी के सबफ़ोल्डर खोज करते रहने के: \ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa आर के माध्यम से: ...

Do आप जानते हैं मेरा क्या मतलब है?

0

मैं भी जब यह आता है 2007 में प्रकाशित बीसीएल टीम, से इस three-part blog post पढ़ने, लेकिन DirectoryInfo की सीमाओं के लिए विशेष रूप से संबंधित सलाह देते हैं घोंसले घोंसले फ़ोल्डर के लिए। इसमें MAX_PATH सीमा, नए \? \ पथ प्रारूप, और विभिन्न .NET- आधारित समाधान और वर्कअराउंड के इतिहास शामिल हैं।

व्यापक, हालांकि शायद थोड़ा दिनांकित है।