2012-03-06 39 views
9

Khi tôi đệ quy qua một số thư mục và tệp, tôi gặp phải lỗi này:C# Làm thế nào tôi có thể giải quyết các giới hạn khi sử dụng DirectoryInfo?

Đường dẫn được chỉ định, tên tệp hoặc cả hai quá dài. Tên tệp hoàn toàn đủ điều kiện phải nhỏ hơn 260 ký tự và đạo diễn phải ít hơn 248 ký tự.

Dưới đây là chức năng của tôi

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(); 
} 

Tôi không thể làm cho tên thư mục ngắn hơn, vì tôi không được phép quá như vậy ... Làm thế nào tôi có thể giải quyết vấn đề này?

Added: Dưới đây là các chức năng khác:

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); 
    } 
} 

EDIT Tìm thấy này, nơi ông sử dụng Zeta Paths Long: How can I use FileInfo class, avoiding PathTooLongException?

đã thực hiện nó và bây giờ tôi sẽ để chương trình chạy qua đêm để xem chương trình có hoạt động hay không.

EDIT Đã sử dụng ZetaLongPath hôm qua và nó hoạt động tốt! Nó thậm chí đã đi qua các thư mục cần quyền truy cập.

EDIT Thay vì zetalongPath, tôi đã sử dụng Delimon.Win32.IO.dll mà tôi nghĩ là tốt hơn nhiều. Nó có cùng giao diện với Win32.

+0

Tôi đoán bạn phải quay trở lại vào Windows API đơn giản (FindFirst */FindNext *) –

+0

Vì vậy, hiện các lỗi xảy ra từ trong 'ProcessFile()', có lẽ mã mà có thể được thay đổi nếu chúng ta có thể nhìn thấy nó? – musefan

+0

Bạn biết rằng bạn là người đầu tiên đến thư mục con sâu nhất trước khi bạn bắt đầu xử lý các tệp ?! Nếu bạn muốn bắt đầu với thư mục gốc, bạn nên di chuyển 'ProcessFile (di);' vào đầu của phương thức. –

Trả lời

8

Dưới đây là thông tin thêm về thư viện Delimon được đề cập trước đó. Thư viện dựa trên .NET Framework 4 trên Microsoft TechNet để khắc phục sự cố tên tệp dài:

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

Nó có phiên bản riêng của các phương pháp chính từ System.IO. Ví dụ, bạn sẽ thay thế:

System.IO.Directory.GetFiles 

với

Delimon.Win32.IO.Directory.GetFiles 

mà sẽ cho phép bạn xử lý các tập tin và thư mục dài.

Từ trang web:

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

Có một cách khác có thể được gọi là AlphaFS: https://github.com/alphaleonis/AlphaFS – TripleAntigen

1

Đây là hạn chế đã biết trong Windows: http://msdn.microsoft.com/en-us/library/aa365247.aspx

Tôi không tin rằng bạn sẽ có thể để có được xung quanh nó, vì vậy bất cứ ai đang nói với bạn rằng bạn không được phép để làm cho chúng ngắn hơn, bạn' sẽ có một đối số khá vững chắc về lý do tại sao bạn phải làm như vậy.

Cách thay thế thực sự duy nhất là di chuyển thư mục sâu ở nơi khác, có thể ngay tại thư mục gốc của ổ đĩa.

EDIT: Trên thực tế có thể có một cách giải quyết: http://www.codinghorror.com/blog/2006/11/filesystem-paths-how-long-is-too-long.html

1

Bạn có thể sử dụng lệnh subst. Nó tạo ra một ổ đĩa ảo bắt đầu từ bất cứ thư mục nào mà bạn truyền vào làm tham số.

Ví dụ, bạn có thể biến đường dẫn c: \ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa vào ổ R: và tiếp tục khám phá các thư mục con của c: \ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa qua R: ...

Đỗ Bạn có hiểu ý tôi?

0

Tôi cũng khuyên bạn nên đọc này three-part blog post từ Đội BCL, xuất bản năm 2007, nhưng quan cụ thể đến những hạn chế của DirectoryInfo khi nói vào các thư mục lồng nhau sâu. Nó bao gồm lịch sử của giới hạn MAX_PATH, định dạng đường dẫn \? \ Mới hơn và các giải pháp dựa trên .NET khác nhau.

Toàn diện, mặc dù có lẽ hơi ngày.

Các vấn đề liên quan