2013-02-19 13 views
5

Moje otwarte źródło software synchronizuje folder zdalny z lokalnym pulpitem. Zdalny folder może być na Alfresco, gdzie długość ścieżki nie ma ograniczenia (/root/very/very/very/long/name.txt).C# Biblioteka we/wy obsługująca długie ścieżki (w celu rozwiązania wyjątku PathTooLongException)

Podczas tworzenia aplikacji użyłem System.IO.File.OpenWrite i System.IO.Stream.Write, ale wydaje się, że they don't support paths over a few hundred characters, więc użytkownicy zgłaszają błędy, takie jak PathTooLongException podczas pracy z długimi ścieżkami.

UNC należy absolutnie unikać ścieżek, ponieważ prowadzą one do niekompatybilności z niektórymi aplikacjami.

Jaką bibliotekę/kod należy użyć w tym przypadku?

To musi być open source C#.

+0

Właśnie zauważyłem zrobiłeś "post własną odpowiedź" funkcję. Jestem gotów postawić cię tam, gdzie przez chwilę bić cię w głowę, zastanawiając się nad tym, a teraz chcesz się podzielić tym, jak to rozwiązałeś, aby inni nie musieli cierpieć. [Byłem tam] (http://stackoverflow.com/q/11346554/80274). –

Odpowiedz

1

".NET 2.0 Workaround for PathTooLongException" (artykuł + kod).

Licencja na licencji Open Project Code (CPOL), która nie jest open source apparently.

Tylko 2 commity nie robią dla bardzo aktywnego projektu, choć ...

+1

Ummm, to nie jest tak naprawdę "projekt", to tylko polecenie użycia PInvoke do wywołania 'CreateFileW' i użycia' \\? \. 'Na początku nazwy twojej ścieżki. –

+0

Odbieram to, patrzę na źródło, on wkłada w to trochę pracy. Nie martwiłbym się o część "niezbyt aktywną".Po prostu owijasz Windows API kilkoma funkcjami pomocniczymi, kiedy pozbyłeś się swoich błędów, nie ma nic więcej do roboty –

1

Native File System Access

Od rewizji 185 (19 lutego th, 2013), biblioteka jest objęta Microsoft Public License (MS-PL), jak określono w nagłówkach plików kodu źródłowego.

Wygląda obiecująco, ale autor advises przeciwko używaniu go w środowisku przedsiębiorstwa, ponieważ kod nie jest wystarczająco solidny.

Ta biblioteka ma numer unit tests, ale brakuje w niej dokumentacji.

+0

Link jest zepsuty –

+0

@ThomasLevesque: Naprawiono, dziękuję za napiwek! –

+0

Nie mogę polecić tej biblioteki. Podstawowa funkcjonalność, taka jak 'File.Open', nie działa (udostępnia uchwyt strumienia, który zwraca i ignoruje parametry' access'/'share'), a wyliczanie plików w trybie cichym ignoruje błędy. – CodesInChaos

2

Możesz wypróbować Base Class Libraries Long Path implementation. Ale pamiętaj, że nie wszystko zadziała, jeśli zaczniesz mieszać się z domyślnymi metodami I/O .NET.

+0

To jest zalecane rozwiązanie. +1 Użyłem wcześniej dużo. Przypominam sobie błąd, który pojawił się w czasie wydania oryginalnego, ale jest to open source i jestem pewien, że zostało to oficjalnie naprawione. –

+0

+1 Świetnie! Licencja jest licencją publiczną Microsoft (Ms-PL), która jest open source, mimo że niestety nie jest zgodna z GNU-GPL: http://www.gnu.org/licenses/license-list.html#ms-pl –

1

Można spróbować dzieląc drogę w górę za pomocą ścieżek względnych podanych w odpowiedzi za pomocą:

Directory.SetCurrentDirectory() 

PathTooLongException in C# code

+0

Interesujące ... może jest biblioteka, która automatycznie wykonuje tę sztuczkę? –

3

AlphaFS pozwala na korzystanie z bardzo długie ścieżki (przy użyciu stylu „\ \?”) i naśladuje przestrzeń nazw System.IO.

Prawdopodobnie będziesz w stanie korzystać z tej biblioteki tak, jakbyś korzystał z System.IO. Na przykład: AlphaFS.Win32.Filesystem.File.Copy() zamiast System.IO.File.Copy().

(source)