Kilka razy spotkałem się z tym problemem w nieodpowiednich momentach:
- Próbowanie pracy nad projektami Java typu open source z głębokimi ścieżkami
- Przechowywanie głębokich drzew wiki Fitnesse pod kontrolą źródła
- Błąd podczas próby użycia Bazaar do importowania mojego drzewa kontroli źródła
Dlaczego ten limit istnieje?
Dlaczego nie został jeszcze usunięty?
Jak radzisz sobie z ograniczeniem ścieżki? I nie, przejście na system Linux lub Mac OS X nie jest prawidłową odpowiedzią na to pytanie;)
Odpowiedzi:
Cytując ten artykuł https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
Teraz widzimy, że jest to 1 + 2 + 256 + 1 lub [dysk] [: \] [ścieżka] [null] = 260. Można założyć, że 256 to rozsądna stała długość łańcucha z dni DOS. Wracając do interfejsów API DOS, zdajemy sobie sprawę, że system śledził bieżącą ścieżkę na dysk i mamy 26 (32 z symbolami) maksymalnej liczby dysków (i bieżących katalogów).
INT 0x21 AH = 0x47 mówi „Ta funkcja zwraca opis ścieżki bez litery dysku i początkowego ukośnika odwrotnego”. Widzimy więc, że system przechowuje CWD jako parę (dysk, ścieżka) i pytasz o ścieżkę, określając dysk (1 = A, 2 = B,…), jeśli określisz 0, wówczas zakłada ona ścieżkę dla dysk zwrócony przez INT 0x21 AH = 0x15 AL = 0x19. Teraz wiemy, dlaczego jest to 260, a nie 256, ponieważ te 4 bajty nie są przechowywane w ciągu ścieżki.
Dlaczego 256-bajtowy ciąg ścieżki, ponieważ 640K wystarcza pamięci RAM.
źródło
Nie jest to do końca prawdą, ponieważ system plików NTFS obsługuje ścieżki do 32 000 znaków. Możesz użyć interfejsu win32 i
\\?\
prefiksu ścieżki, aby użyć więcej niż 260 znaków.Szczegółowe wyjaśnienie długiej ścieżki z bloga zespołu .Net BCL .
Mały fragment podkreśla problem długimi ścieżkami
źródło
Pytanie brzmi, dlaczego ograniczenie wciąż istnieje. Z pewnością nowoczesny system Windows może zwiększyć stronę,
MAX_PATH
aby umożliwić dłuższe ścieżki. Dlaczego ograniczenie nie zostało usunięte?Dzięki umowie interfejsu API system Windows gwarantuje wszystkim aplikacjom, że standardowe interfejsy API plików nigdy nie zwrócą ścieżki dłuższej niż
260
znaki.Rozważ następujący poprawny kod:
Windows zagwarantował programowi, że zapełni moją
WIN32_FIND_DATA
strukturę:Moja aplikacja nie zadeklarowała wartości stałej
MAX_PATH
, tak jak Windows API. Moja aplikacja wykorzystała tę zdefiniowaną wartość.Moja struktura jest poprawnie zdefiniowana i przydziela tylko
592
bajty ogółem. Oznacza to, że mogę otrzymać tylko nazwę pliku składającą się z mniej niż260
znaków. Windows obiecał mi, że jeśli poprawnie napisam moją aplikację, będzie ona nadal działać w przyszłości.Gdyby system Windows zezwolił na nazwy plików dłuższe niż
260
znaki, moja istniejąca aplikacja (która prawidłowo używała poprawnego interfejsu API) nie działałaby.Każdy, kto wzywa Microsoft do zmiany
MAX_PATH
stałej, musi najpierw upewnić się, że żadna istniejąca aplikacja nie uległa awarii. Na przykład nadal posiadam i używam aplikacji Windows, która została napisana do działania w systemie Windows 3.11. Nadal działa na 64-bitowym systemie Windows 10. Właśnie to zapewnia kompatybilność wsteczna.Microsoft zrobił stworzyć drogę do korzystania z pełnych 32.768 nazw ścieżek; ale musieli stworzyć nową umowę API, aby to zrobić. Po pierwsze, powinieneś użyć Shell API do wyliczenia plików (ponieważ nie wszystkie pliki istnieją na dysku twardym lub w udziale sieciowym).
Ale nie muszą również łamać istniejących aplikacji użytkownika. Zdecydowana większość aplikacji nie używa interfejsu API powłoki do pracy z plikami. Wszyscy tylko dzwonią
FindFirstFile
/FindNextFile
i dzwonią na jeden dzień.źródło
W systemie Windows 10. możesz usunąć to ograniczenie , modyfikując klucz rejestru.
źródło
Możesz zamontować folder jako dysk. Jeśli masz ścieżkę z wiersza poleceń,
C:\path\to\long\folder
możesz zmapować ją na literę dyskuX:
za pomocą:źródło
subst
jest lokalnym sesji / konto - patrz superuser.com/questions/29072/... dla jak zrobić to „system wide”Jednym ze sposobów radzenia sobie z ograniczeniem ścieżki jest skrócenie wpisów ścieżki za pomocą dowiązań symbolicznych.
Na przykład:
C:\p
katalog, aby przechowywać krótkie linki do długich ścieżekmklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
C:\p\foo
do swojej ścieżki zamiast długiej ścieżkiźródło
/j
opcja tworzy punkt podłączenia węzła dla lokalnego urządzenia woluminu lub ścieżkę na woluminie lokalnym (np. Podłączenie powiązania Unix). Nie tworzy dowiązania symbolicznego. Jest to ważne rozróżnienie, ponieważ punkty montowania połączeń są zawsze oceniane na serwerze i muszą być kierowane na urządzenia lokalne, podczas gdy dowiązania symboliczne są oceniane na kliencie i mogą być ukierunkowane na ścieżki zdalne (jeśli pozwalają na to zasady). Podobnie jak dysk subst.exe (tj.DefineDosDeviceW
), Miejsce docelowe połączenia jest zwykle ograniczone do około 4K znaków. To właściwie 8 000 znaków, podzielonych mniej więcej równo między ścieżkę zastępczą i ścieżkę wyświetlania.Możesz włączyć długie nazwy ścieżek za pomocą PowerShell:
Inną wersją jest użycie zasad grupy w
Computer Configuration
/Administrative Templates
/System
/Filesystem
:źródło
Jak się dlaczego to, nadal istnieje - MS nie uważa tego za priorytet i ceni kompatybilność wsteczną zamiast ulepszania swojego systemu operacyjnego (przynajmniej w tym przypadku).
Obejściem, którego używam, jest użycie „krótkich nazw” dla katalogów na ścieżce, zamiast ich standardowych, czytelnych dla człowieka wersji. Tak np. Dla
C:\Program Files\
chciałbym użyćC:\PROGRA~1\
Możesz znaleźć odpowiedniki krótkiej nazwy za pomocądir /x
.źródło
PATH
i przekażSearchPathW
. Jest także wydajny, ponieważ biblioteka środowiska wykonawczego i tak tworzy ścieżki urządzeń „\\? \” Dla systemu NT. Co do nowszych systemów plików, prawdopodobnie nie widzielibyśmy oprogramowania zainstalowanego na woluminie exFAT, innym niż aplikacje przenośne, ponieważ nie ma ono zabezpieczeń, ale nie wykluczałbym ReFS. Użytkownicy instalują programy w niestandardowych lokalizacjach ze względu na wygodę, przestrzeń lub wydajność.Jeśli chodzi o sposób radzenia sobie z ograniczeniem rozmiaru ścieżki w systemie Windows - użycie 7zip do pakowania (i rozpakowywania) plików wrażliwych na długość ścieżki wydaje się realnym obejściem. Użyłem go do transportu kilku instalacji IDE (tych ścieżek wtyczek Eclipse, tak!) I stosów dokumentacji generowanej automatycznie i do tej pory nie miałem żadnego problemu.
Nie bardzo wiem, jak omija limit 260 znaków ustawiony przez Windows (z technicznego PoV), ale hej, to działa!
Więcej informacji na stronie SourceForge tutaj :
i informacje o wersji :
WAŻNA UWAGA: Aby to działało poprawnie, musisz bezpośrednio określić ścieżkę docelową w oknie dialogowym „Wyodrębnij” 7zip , zamiast przeciągania i upuszczania plików do zamierzonego folderu. W przeciwnym razie folder „Temp” zostanie użyty jako tymczasowa pamięć podręczna, a po przywróceniu plików do ich „ostatecznego miejsca spoczynku” nastąpi odbicie do tego samego ograniczenia 260 znaków. Aby uzyskać więcej informacji, zobacz odpowiedzi na to pytanie .
źródło
Tak, i z jakiegoś powodu jest to ustawienie domyślne, ale można go łatwo zastąpić za pomocą tego klucza rejestru:
Zobacz: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
źródło
Innym sposobem radzenia sobie z tym jest użycie Cygwin, w zależności od tego, co chcesz zrobić z plikami (tj. Czy polecenia Cygwin odpowiadają Twoim potrzebom)
Na przykład pozwala kopiować, przenosić lub zmieniać nazwy plików, których nawet Eksplorator Windows nie może. Lub oczywiście zajmuj się ich zawartością, taką jak md5sum, grep, gzip itp.
Również w przypadku programów, które kodujesz, możesz połączyć je z biblioteką DLL Cygwin i umożliwić im korzystanie z długich ścieżek (nie testowałem tego jednak)
źródło