Chociaż NTFS zezwala na ścieżki o długości około 32 000 znaków, znalazłeś ograniczenie długości 259 znaków w API Win32 .
W interfejsie API systemu Windows (z pewnymi wyjątkami omówionymi w [połączonym dokumencie]) maksymalna długość ścieżki wynosi MAX_PATH
260 znaków.
(Dodatkowo NULL
do ścieżki dołączony jest znak zakończenia, który daje nam 259 użytecznych znaków).
Ponieważ Explorer (i prawie wszystkie inne aplikacje Windows) polegają na interfejsie API Win32 do dostępu do systemu plików, obejście tego ograniczenia nie jest praktyczne, nawet jeśli jest to możliwe :
Interfejs API systemu Windows ma wiele funkcji, które również mają wersje Unicode, co pozwala na ścieżkę o rozszerzonej długości dla maksymalnej całkowitej długości ścieżki wynoszącej 32 767 znaków. Ten typ ścieżki składa się ze składników oddzielonych ukośnikami odwrotnymi, każdy do wartości zwracanej w lpMaximumComponentLength
parametrze GetVolumeInformation
funkcji (ta wartość to zwykle 255 znaków). Aby określić ścieżkę o przedłużonej długości, użyj przedrostka „\\? \”. Na przykład „\\? \ D: \ bardzo długa ścieżka ”.
Niestety nie można po prostu wpisać \\?\D:\very long path
okna Eksploratora. Aplikacja musi być zaprojektowana tak, aby korzystała z tych interfejsów API i obsługiwała bardzo długie nazwy ścieżek.
Jednym ze sposobów dostępu do ścieżek o większej długości w systemie Windows jest zainstalowanie Cygwin , warstwy emulacji * nix dla systemu Windows. W moich testach Cygwin nie wydaje się być ograniczony przez MAX_PATH
; bash i vi nie miały problemów ze ścieżkami o długości 2000 znaków.
Pamiętaj, że chociaż możesz używać bash do przeglądania ścieżek o dużej długości, prawdopodobnie nie będziesz w stanie otwierać plików w tych ścieżkach w zwykłych aplikacjach Windows. Na przykład, pisząc, notepad
gdy katalog roboczy jest ścieżką o większej długości, dostajesz
Błąd: bieżący katalog roboczy ma ścieżkę dłuższą niż dozwolona dla katalogu roboczego Win32. Nie można uruchomić natywnej aplikacji Windows stąd.
Próbowanie notepad "\\?\D:\very long path\file.txt"
też nie działa; uruchamia się, ale mówi tylko „Nie można znaleźć pliku ...” Próbowanie tego samego z Notepad ++ powoduje awarię. (Prawdopodobnie przepełnienie bufora.)
Inną opcją dostępu do określonych plików zakopanych głęboko w ścieżce o przedłużonej długości jest skrócenie samej ścieżki poprzez utworzenie punktu połączenia NTFS . Z wiersza polecenia z podwyższonym poziomem uprawnień:
D:\> mklink /J jct "\\?\D:\very\long\path"
Możesz teraz uzyskać dostęp do zawartości D:\very\long\path\
z D:\jct\
. Nie napotkasz żadnych problemów z długością ścieżki, ponieważ jeśli chodzi o Eksploratora i inne aplikacje, ścieżka jest po prostu D:\jct\
(lub cokolwiek innego). Sterownik NTFS obsługuje przezroczyste przekierowywanie ścieżki („punktu ponownej analizy”).
Minusem tego podejścia jest oczywiście to, że musisz utworzyć skrzyżowanie w pobliżu pliku, do którego chcesz uzyskać dostęp; nadal nie możesz po prostu przeglądać całej struktury katalogów.
Jeśli chodzi o znaki specjalne ( " * : < > ? \ |
), to po prostu nie do przejścia. Znaki te mają specjalne znaczenie w systemie Windows, więc nie można ich używać w ścieżkach. (Cygwin pozwala tworzyć pliki ze znakami specjalnymi, ale robi to poprzez zastępowanie znaków znakami specjalnymi Unicode, które następnie zastępuje podczas czytania. Przeglądanie tych plików stworzonych przez Cygwin w systemie Linux lub w Eksploratorze nie wyglądałoby dobrze, ponieważ znaki Unicode nie zostaną zastąpione ponownie).
Wszystko to powiedziało: co robisz, co wymaga bardzo długich ścieżek? Być może mógłbyś ułatwić sobie życie, dokonując ponownej oceny tego, co robisz i unikając długich ścieżek. Możliwe, że i tak nie potrzebujesz tak długich ścieżek .