Pytanie Dlaczego limit długości ścieżki wynoszący 260 znaków istnieje w systemie Windows?


Kilka razy natknąłem się na ten problem w nieodpowiednich momentach:

  • próby pracy nad projektami Java o otwartym źródle z głębokimi ścieżkami
  • Przechowywanie głębokich drzew wiki Fitnesse w kontroli źródła
  • Błąd podczas próby użycia Bazaar do zaimportowania drzewa kontroli źródła

Dlaczego istnieje ten limit?

Dlaczego go jeszcze nie usunięto?

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


321
2017-12-10 11:18


pochodzenie


@Artelius: Właściwie Windows (przynajmniej od wersji Win2K) obsługuje punkty połączenia (en.wikipedia.org/wiki/NTFS_junction_point), a Vista wspiera NT dowiązania symboliczne (en.wikipedia.org/wiki/NTFS_symbolic_link). W każdym razie, podczas gdy dowiązania symboliczne mogą pomóc uczynić dłuższe / zagnieżdżone ścieżki bardziej przyjaznymi, nie mogę pomyśleć, w jaki sposób dowiązania symboliczne pomogłyby, jeśli trafisz na ograniczenia długości ścieżki. - Ashutosh Mehra
Złe wieści: To nigdy nie zostanie naprawione. visualstudio.uservoice.com/forums/121579-visual-studio/... - Patrick Szalapski
Nawet jeśli ten limit nie istniał, zawsze istnieje wiele innych ograniczeń, a każdy z nich może być w pewnym momencie denerwujący. Chodzi o to, dlaczego ten limit jest tak niski? Po zakończeniu ery 8.3 i sprzętem o wielkości mega / giga, ścieżka powinna być dynamicznie przydzielanym łańcuchem o praktycznie nieograniczonym rozmiarze. - Roland
Microsoft w końcu rozwiązuje ten problem w Windows 10 Build 14352. - Warren P
@PatrickSzalapski niestety zostało naprawione visualstudio.uservoice.com/forums/121579-visual-studio/... - phuclv


Odpowiedzi:


Cytując ten artykuł http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath

Maksymalne ograniczenie długości ścieżki

W interfejsie API systemu Windows (z pewnymi wyjątkami omówionymi w poniższych akapitach) maksymalna długość ścieżki to MAX_PATH, który jest zdefiniowany jako 260 znaków. Ścieżka lokalna jest uporządkowana w następującej kolejności: litera dysku, dwukropek, ukośnik odwrotny, komponenty nazw oddzielone przez ukośniki odwrotne i kończący znak pusty. Na przykład maksymalna ścieżka na dysku D to "D: \jakiś 256-znakowy ciąg znaków<NUL> "gdzie" <NUL> "oznacza niewidoczny, kończący pusty znak null dla bieżącej strony kodowej systemu. (Znaki <> są tutaj użyte dla przejrzystości wizualnej i nie mogą być częścią prawidłowego ciągu znaków).

Teraz widzimy, że jest to 1 + 2 + 256 + 1 lub [dysk] [: \] [ścieżka] [null] = 260. Można przyjąć, że 256 to rozsądna stała długość ciągu od dni DOS. Wracając do interfejsów API systemu DOS, zdajemy sobie sprawę, że system śledzi bieżącą ścieżkę na dysku i tak właśnie jest 26 (32 z symbolami) maksymalnych napędów (i bieżące katalogi).

Błąd 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ę (napęd, ścieżka) i pytasz o ścieżkę, określając drive (1 = A, 2 = B, ...), jeśli podasz 0, przyjmuje ścieżkę do napędu zwróconą 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 znaków, ponieważ 640K to wystarczająca ilość pamięci RAM.


185
2017-12-10 11:45



Interfejs API systemu Windows ogranicza długość, nawet w najnowszym systemie operacyjnym. Microsoft obawia się złamania setek milionów systemów operacyjnych, które dziś są w użyciu, gdyby miało się to zmienić, ponieważ nie mają już geniuszy, którzy rozumieją API wewnątrz i na zewnątrz, tak jak w latach 80. i 90. XX wieku. Ryzyko nie jest warte zmiany. serverfault.com/questions/163419/... - MacGyver
@MacGyver Przepraszam, ale to kompletna bzdura. Microsoft nie chce łamać milionów źle napisanych aplikacji założyć rzeczy o systemie, które nigdy nie były gwarantowane. Niestety, przez długi czas sytuacja wyglądała tak samo, że deweloperzy zaczęli na nich polegać, więc zmiana tej wersji spowodowałaby przerwanie aplikacji innych firm, a państwo członkowskie byłoby obwiniane. - Basic
przy okazji nie ma żadnego dowodu na to, że Gates kiedykolwiek powiedział, że "640K RAM wystarcza dla wszystkich" computerworld.com/article/2534312 - for3st
@Basic Limit 260 znaków był gwarantowane przez Windows. Stała została zadeklarowana jako stały, struktura została zadeklarowana w plikach nagłówkowych Windows, która ma tylko 260 znaków. Nie ma sposobu, aby to zmienić. - Ian Boyd
@Basic Stała nie zmienia się, gdy jest wkompilowana w moją aplikację. Uruchomiłem aplikację, która była ostatnia wybudowany w 1994 r. i nadal działa w Windows 10. Microsoft obiecał pewien binarny rozmiar bloku pamięci, a programista przestrzegał tej zasady. Jeśli Microsoft miałby zmienić stałą, to każda istniejąca aplikacja, która poprawnie zastosowała API programistyczne, zostałaby uszkodzona. Nie możesz złamać kompatybilności binarnej. - Ian Boyd


Nie jest to ściśle prawda, ponieważ system plików NTFS obsługuje ścieżki o długości do 32k znaków. Możesz użyć ap32 win32 i "\\?\"przedrostek ścieżki do użycia więcej niż 260 znaków.

Szczegółowe wyjaśnienie długiej ścieżki z .Net Blog zespołu BCL.
Mały fragment podkreśla problem z długimi ścieżkami

Kolejną kwestią jest niespójne zachowanie, które mogłoby skutkować ujawnieniem długich ścieżek. Długie ścieżki z \\?\ Prefiks może być używany w większości interfejsów API Windows związanych z plikami, ale nie we wszystkich interfejsach API systemu Windows. Na przykład funkcja LoadLibrary, która odwzorowuje moduł na adres procesu wywołującego, nie działa, jeśli nazwa pliku jest dłuższa niż MAX_PATH. Oznacza to, że MoveFile pozwoli ci przenieść bibliotekę DLL do lokalizacji w taki sposób, że jej ścieżka będzie dłuższa niż 260 znaków, ale próba załadowania biblioteki DLL zakończy się niepowodzeniem. Istnieją podobne przykłady w całym interfejsie API systemu Windows; istnieją pewne rozwiązania, ale są one rozpatrywane indywidualnie.


129
2017-12-10 11:52



Wystarczająco uczciwe, ale oznacza to, że musisz używać P / Invoke w wielu miejscach i to, moim zdaniem, zmniejsza przenośność twojego kodu .Net. Co się stanie, jeśli chcę zachować zgodność Mono? - Jeffrey Cameron
Chodzi mi o to, że możesz użyć długiej ścieżki, jeśli naprawdę chcesz. Ale zgadzam się, że to jest ból i osobiście też tego uniknęłbym. - softveda
To powinna być wybrana odpowiedź. Właściwie odpowiada na pytanie postawione przez użytkownika, DLACZEGO ten limit istnieje i zapewnia obejście. Awansuj na widoczność - KyleMit
Wydaje mi się, że Microsoft musi naprawić swoje interfejsy API i myślę, że to nie jest priorytet. Byłem zaskoczony, że ten limit nadal istnieje w systemie Windows 8. - Mas
@Mas "Naprawiono", co chcesz, zostało zrobione z powrotem do systemu Windows XP. Wywołanie wersji API ich unikodu pozwoli ci uzyskać dostęp do "rozszerzonej ścieżki". Wierzę, że Explorer automatycznie to obsługuje. Oto jedna z takich funkcji, która ją obsługuje - msdn.microsoft.com/en-us/library/windows/desktop/... . - Nathan Adams


Pytanie brzmi czemu czy ograniczenie nadal istnieje. Z pewnością nowoczesne Windows może zwiększyć stronę MAX_PATH aby umożliwić dłuższe ścieżki. Dlaczego ograniczenie nie zostało usunięte?

  • Powodem, dla którego nie można go usunąć, jest to, że Windows obiecał, że nigdy się nie zmieni.

Dzięki umowie dotyczącej interfejsu API system Windows gwarantuje, że wszystkie standardowe interfejsy API plików nigdy nie zwrócą ścieżki dłuższej niż 260 postacie.

Rozważ następujące poprawny kod:

WIN32_FIND_DATA findData;

FindFileFirst("C:\Contoso\*", ref findData);

Windows gwarantowane mój program, który zapełni mój WIN32_FIND_DATA Struktura:

WIN32_FIND_DATA {
   DWORD    dwFileAttributes;
   FILETIME ftCreationTime;
   FILETIME ftLastAccessTime;
   FILETIME ftLastWriteTime;
   //...
   TCHAR    cFileName[MAX_PATH];
   //..
}

Moja aplikacja nie zadeklarowała wartości stałej MAX_PATH, zrobił to Windows API. Moja aplikacja używa tej zdefiniowanej wartości.

Moja struktura jest poprawnie zdefiniowana i tylko przydziela 592 ogółem bajtów. Oznacza to, że mogę otrzymać tylko nazwę pliku, która jest mniejsza niż 260 postacie. Windows obiecane mnie, gdybym poprawnie napisał moją aplikację, moja aplikacja nadal działałaby w przyszłości.

Jeśli system Windows miałby zezwalać na nazwy plików dłuższe niż 260 znaków wtedy moja istniejąca aplikacja (która poprawnie użyła poprawnego API) nie udałaby się.

Dla każdego, kto wzywa Microsoft do zmiany MAX_PATH stałe, najpierw muszą upewnić się, że żadna istniejąca aplikacja nie zawodzi. Na przykład wciąż mam i używam aplikacji systemu Windows, która została napisana do uruchomienia w systemie Windows 3.11. Nadal działa na 64-bitowym systemie Windows 10. Właśnie to zapewnia zgodność wsteczna.

Microsoft zrobił stworzyć sposób na użycie 32 768 ścieżek; ale musieli stworzyć nową umowę API, aby to zrobić. Po pierwsze, powinieneś użyć Shell API wyliczyć pliki (ponieważ nie wszystkie pliki istnieją na dysku twardym lub w udziale sieciowym).

Ale nie muszą również łamać istniejących aplikacji użytkowników. Zdecydowana większość aplikacji to robi nie użyj api powłoki do pracy z plikami. Wszyscy po prostu dzwonią FindFirstFile/FindNextFile i nazywa to dzień.


79
2018-06-30 15:47



@JosiahKeller Jeśli tak, to złamie pierwotnie zdefiniowaną umowę dla tej metody, i może to spowodować nadpisanie niezamierzonej pamięci i otwarcie luki bezpieczeństwa. Jedynym sposobem rozwiązania tego problemu jest zaoferowanie nowego ulepszonego interfejsu API (takiego jak wersje obsługujące Unicode) nadzieja wszyscy rekompilują / ponownie wydobywają wszystkie aplikacje za pomocą nowszego API. - Rowland Shaw
Microsoft musi się pośpieszyć i zrobić tam Linux Distro ... Natychmiast przełączę się i kończę starym API pogniecionych okien. - Ryan Mann
@Ryios Nie sądzę, że moje istniejące aplikacje Windows będą działać na Linuksie. - Ian Boyd
Kompatybilność wsteczna jest miła. Ale myślę, że unikanie takich (często bardzo paskudnych) problemów jest dziś ważniejsze niż wspieranie aplikacji Windows 3.1. Ile osób napotyka problemy z długimi ścieżkami? A ilu ludzi nadal używa aplikacji Windows 3.1? Zablokowali nawet obsługę systemu Windows XP. Dlaczego więc nie ogłosili, że z aplikacji Windows [x] i późniejszych, które zakładają, że ścieżka nie będzie dłuższa niż 260 znaków, nie będą działały zgodnie z oczekiwaniami, gdy będą mieć długą ścieżkę? Nasze ograniczenia prędkości również nie dotyczą wózków. - JuSchu
@ Juuchu To nie tylko aplikacje Windows 3.1. Aplikacje napisane dzisiaj przy użyciu prawidłowego interfejsu API nie będą działać. - Ian Boyd


Z Windows 10. możesz usuń ograniczenie przez modyfikację klucza rejestru.

Wskazówka  Począwszy od wersji Windows 10, w wersji 1607, ograniczenia MAX_PATH zostały usunięte z typowych funkcji plików i katalogów Win32. Musisz jednak zaakceptować nowe zachowanie.

Klucz rejestru umożliwia włączenie lub wyłączenie nowego zachowania długich ścieżek. Aby włączyć zachowanie długich ścieżek, ustaw klucz rejestru na HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Rodzaj: REG_DWORD). Wartość klucza zostanie zapisana w pamięci podręcznej przez system (dla każdego procesu) po pierwszym wywołaniu funkcji pliku lub funkcji katalogu Win32 (lista następuje). Klucz rejestru nie zostanie ponownie załadowany podczas całego okresu trwania procesu. Aby wszystkie aplikacje w systemie rozpoznały wartość klucza, może być wymagane ponowne uruchomienie, ponieważ niektóre procesy mogły zostać uruchomione przed ustawieniem klucza.   Klucz rejestru można również kontrolować za pomocą zasad grupy na stronie Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths.   Możesz też włączyć nowe zachowanie długich ścieżek na aplikację za pośrednictwem manifestu:

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

29
2017-10-28 12:49



Dziękujemy, ale proszę podać więcej informacji na wypadek, gdyby link przestał działać - WhiteKnight
Z witryny MS: Począwszy od wersji Windows 10, w wersji 1607, ograniczenia MAX_PATH zostały usunięte z typowych funkcji plików i katalogów Win32. Musisz jednak zaakceptować nowe zachowanie. Aby włączyć zachowanie długich ścieżek, ustaw klucz rejestru w HKLM \ SYSTEM \ CurrentControlSet \ Control \ FileSystem "LongPathsEnabled" (DWORD). Aby wszystkie aplikacje w systemie rozpoznały wartość klucza, może być wymagane ponowne uruchomienie. Można to również kontrolować za pomocą zasad grupy w Computer Configuration> Administrative Templates> System> Filesystem> Enable NTFS long paths. - user2433523
Niestety nawet w najnowszej wersji Win10, sam Eksplorator plików nadal ma problem z nazwą długiej ścieżki. Nawet "Kopiuj jako ścieżka" w menu kontekstowym nie działa zgodnie z oczekiwaniami; kopiuje tylko pierwsze 260 znaków. Nie możesz utworzyć folderu, skopiować / przenieść / otworzyć pliku ... Zastanów się, jaki jest sens tej zmiany. - raymai97


Możesz zamontować folder jako napęd. Z linii poleceń, jeśli masz ścieżkę C:\path\to\long\folder możesz zmapować go do litery dysku X: za pomocą:

subst x: \path\to\long\folder

25
2017-12-10 11:56



Otrzymuję "Nieprawidłowy parametr j:" podczas próby wykonania tego polecenia - barrypicker
Należy go uruchomić z poziomu wiersza polecenia administratora (podwyższonego poziomu). - Mrchief
To się nie uda z ukośnikami w przód, musi to być ukośnik odwrotny. - cchamberlain
Nie jestem pewien, czy dotyczy to tylko systemu Windows 10, jednak odkryłem, że podczas próby uruchomienia tego polecenia, jeśli uruchamiam się jako administrator, jak sugerowano powyżej, napęd nie wydaje się być dostępny. Dzieje się tak dlatego, że zachowanie wygląda podobnie do mapowania dysku sieciowego i jest specyficzne dla sesji itp., Więc gdy uruchomiłem jako administrator i użyłem tego polecenia, sesja ta mogłaby skorzystać z x: TL; DR Jeśli nie możesz zobaczyć dysku, spróbuj uruchomienie polecenia bez trybu administratora. - Jaddie
subst x: "\path\to\long\folder" pracował dla mnie - Sboniso Marcus Nzimande


Jednym ze sposobów radzenia sobie z ograniczeniem ścieżki jest skracanie ścieżek z dowiązaniami symbolicznymi.

Na przykład:

  1. Stwórz C:\p katalog, aby zachować krótkie linki do długich ścieżek
  2. mklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
  3. Dodaj C:\p\foo na twoją ścieżkę zamiast długiej ścieżki

12
2017-08-01 21:51



Nie trzeba było najpierw tworzyć katalogu, więc krok 1 nie jest konieczny. - ohaal
Działa dobrze na Ant / Java, dzięki! - Miao1007
Ta sztuczka nie zawsze działa tak, jak wiele aplikacji próbuje rozwiązać linki - nponeccop


Co się tyczy czemu to nadal istnieje - MS nie uważa tego za priorytetowy i ceni sobie wsteczną kompatybilność z rozwojem systemu operacyjnego (przynajmniej w tym przypadku).

Obejściem, którego używam jest użycie "krótkich nazw" w katalogach znajdujących się na ścieżce, zamiast ich standardowych, czytelnych dla człowieka wersji. Więc na przykład dla C:\Program Files\ użyłbym C:\PROGRA~1\  Możesz znaleźć krótkie odpowiedniki nazwy za pomocą dir /x.


6
2017-12-19 15:02



Krótkie nazwy ścieżek mogą być wyłączone w rejestrze (lub był to system plików?), Więc to naprawdę nie jest niezawodne obejście. - rubenvb
@rubenvb Jestem pewien, że większość, jeśli nie wszystkie funkcje systemu Windows mogą być wyłączone w rejestrze, więc ¯ \ _ (ツ) _ / ¯ - Conrad


W jaki sposób radzić sobie z ograniczeniem rozmiaru ścieżki w systemie Windows - używając 7zip aby spakować (i rozpakować) pliki wrażliwe na długość ścieżki, wydaje się być wykonalnym sposobem obejścia tego problemu. Użyłem go do przetransportowania kilku instalacji IDE (tych ścieżek wtyczek Eclipse, yikes!) I stosów autogenerowanej dokumentacji i jak dotąd nie miałem żadnego problemu.

Nie bardzo wiem, w jaki sposób omija limit 260 znaków ustalony przez system Windows (z technicznego PoV), ale hej, działa!

Więcej szczegółów na ich stronie SourceForge tutaj:

"System NTFS może w rzeczywistości obsługiwać ścieżki o długości do 32 000 znaków   długość."

7-zip obsługuje również długie nazwy.

Ale jest wyłączone w kodzie SFX. Niektórzy użytkownicy nie lubią długich ścieżek, ponieważ   nie rozumieją, jak z nimi pracować. Właśnie dlatego mam   wyłączono go w kodzie SFX.

i Informacje o wydaniu:

9,32 alfa 2013-12-01

  • Ulepszono obsługę ścieżek plików dłuższych niż 260 znaków.

4.44 beta 2007-01-20

  • 7-Zip obsługuje teraz ścieżki plików dłuższe niż 260 znaków.

WAŻNA UWAGA: Aby to działało poprawnie, musisz podać ścieżkę docelową w 7zip Okno "Wyodrębnij" bezpośrednio, zamiast przeciągać i upuszczać pliki do wybranego folderu. W przeciwnym razie folder tymczasowy zostanie użyty jako tymczasowa pamięć podręczna, a po usunięciu plików z systemu Windows Explorer przeniesie się do tego samego ograniczenia 260 znaków. Zobacz odpowiedzi na to pytanie po więcej informacji.


6
2017-07-24 07:38



Myliłem się, 7zip i WinRAR wyodrębniają wszystkie foldery i pliki. Po prostu właściwość folderu w systemie Windows zgłasza tylko liczbę folderów i plików, które nie naruszają ograniczenia. To tak, jakby Eksplorator Windows nie kopał głębiej, aby odkryć foldery po osiągnięciu maksymalnej ścieżki. - Twisted Whisper
Możliwe jest kasować długa ścieżka w 7-zip z shift-del. - Laurie Stearn
Krótka odpowiedź - użyj programu 7zip, aby rozpakować plik .zip .... pracował dla mnie w systemie Windows 7 - andrewcockerham