2011-08-22 25 views
9

Tôi có các tệp trên ổ cứng của mình ném một số PathTooLongException khi tôi truy cập thuộc tính Fullname của đối tượng FileSystemInfo. Có cách nào xung quanh điều này (không bao gồm đổi tên các tập tin mà không phải là một lựa chọn)?Bất kỳ cách nào để làm việc xung quanh PathTooLongException rằng FileSystemInfo.Fullname ném đôi khi?

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath đề cập bởi câu trả lời khác đề nghị đặt một "\? \" Tiền tố vào tên tập tin nhưng trong trường hợp này DirectoryInfo.GetFileSystemInfos() có trách nhiệm tạo các FileSystemInfo đối tượng và DirectoryInfo không chấp nhận tiền tố đó nên không có cách nào để sử dụng nó .

Câu trả lời "PathTooLongException in C# code" không hữu ích vì đây là ứng dụng đa luồng và tôi không thể tiếp tục thay đổi đường dẫn ứng dụng hiện tại.

Tôi có thực sự phải làm mọi thứ với PInvoke chỉ để có thể đọc mọi tệp trên ổ cứng?

+1

Bạn đã thử: http://www.codeproject.com/KB/files/LongFileNames.aspx? –

Trả lời

3

này có vẻ thú vị ... Codeplex Long Path Wrapper

Đường dẫn wrapper dài cung cấp chức năng để làm cho nó dễ dàng hơn để làm việc với những con đường dài hơn giới hạn 259 ký tự hiện của không gian tên System.IO. Sử dụng các lớp đường dẫn dài, các dự án có thể sử dụng các đường dẫn lên tới 32.000 ký tự.

Tôi sẽ thử, mặc dù tôi lưu ý ngay lập tức nó không cung cấp phương thức tương đương với DirectoryInfo.GetFileSystemInfos() do đó cần sửa đổi.

2

Không có nhiều chương trình có thể tồn tại một đường dẫn lớn hơn 259 ký tự. Giới hạn khá khó cho lớp winapi, MAX_PATH ở mọi nơi. Nó đã được xem xét cho .NET nhưng không có kết quả cụ thể. Chuỗi bài đăng trên blog ends here có liên kết đến các mục nhập trước đó ở dưới cùng.

2

Làm việc chính xác với đường dẫn dài không khó như vậy - ví dụ: SetACL. Nhưng:

  • các lớp .NET framework không hỗ trợ con đường dài nên bạn không thể sử dụng chúng
  • bạn cần phải viết một wrapper cho mỗi chức năng hệ thống tập tin API để nó sử dụng con đường dài đúng cho cả địa phương và UNC đường dẫn

Dưới đây là tài liệu trên MSDN về con đường dài: http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx

0

Đối .net 4.0 Delimon.Win32.I​O Library (V4.0) có thể được sử dụng. Nó promisses tên đường dẫn rất dài mà không cần thay đổi mã. Nhưng có vẻ như có một số vấn đề.

1

Kể từ Windows 10 (hoặc Windows Server 2016) và .Net 4.6.2, đường dẫn dài có thể được hỗ trợ trực tiếp nếu cài đặt đăng ký được bật và ứng dụng của bạn được đánh dấu là "nhận thức đường dẫn dài".

Các thiết lập có thể được truy cập thông qua Local Group Policy Editor (gpedit.msc), dưới Computer Configuration>Administrative Templates>All Settings>Enable Win32 đường dài

Để đánh dấu của bạn ứng dụng là "nhận thức đường dẫn dài", thêm phần này vào tệp kê khai của bạn:

<application xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <windowsSettings> 
    <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> 
    </windowsSettings> 
</application> 

Additiona lly, nếu ứng dụng bạn nhắm mục tiêu một phiên bản của .Net framework sớm hơn 4.6.2, bạn sẽ cần phải thêm một phần để file App.config của bạn:

<configuration> 
    <runtime> 
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" /> 
    </runtime> 
</configuration> 

Để biết thêm thông tin xem:
https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/ https://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx

(Theo như tôi biết, điều này chỉ ảnh hưởng đến API hệ thống tệp cơ bản của Windows. Các API không phải là hệ thống tệp có thể vẫn được giới hạn trong 260 ký tự)

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