Pokonanie ograniczeń maksymalnej długości ścieżki do pliku w systemie Windows

36

Jeden z naszych klientów zwykle używa bardzo długich nazw ścieżek (kilka zagnieżdżonych folderów z długimi nazwami) i rutynowo napotykamy „problemy z edukacją użytkowników” w celu skrócenia ścieżki do mniej niż 260 znaków.

Czy jest dostępne rozwiązanie techniczne, czy możemy przesunąć przełącznik w systemie Windows 7 i Windows 2008 R2, aby powiedzieć „tak, po prostu zignoruj ​​te historyczne problemy i spraw, aby nazwa ścieżki +260 działała”.

PS Przeczytałem Pliki i ścieżki nazw i przestrzenie nazw

Christopher Edwards
źródło
3
Oto rok 2018, a problem nadal występuje w ROBOCOPY. Limit 255. Przekraczający go po prostu piszczą, ale nie kopiują.
SDsolar
@Ssolsol: czy używasz starej wersji robocopy?
Naikrovek
Tak, chciałem powiedzieć to samo - trzeba użyć robocopy specjalnie, ponieważ może on obsługiwać długie ścieżki ...
Rob Nicholson

Odpowiedzi:

12

Metody są dostępne, ale dopóki Microsoft nie przekoduje widżetu przeglądarki plików, prawie utknęliśmy z tym starym problemem. Jest nieoptymalny, ale właśnie tak działa.

sysadmin1138
źródło
5
Błąd w oprogramowaniu MS, który został naprawiony dla kilku wydań systemu operacyjnego, to jest nowy ...
Hubert Kario 24.11.11
2
Windows 10 1607 w końcu naprawił problem z przeglądarką plików i ma pewne umiejętności w zakresie oszukiwania aplikacji Win32 do pracy w tym dziwnym nowym świecie ogromnych ścieżek: howtogeek.com/266621/…
HackSlash
28

Wspomnę tylko o sztuczce, której jeszcze nie widzę.

Weźmy na przykład ten plik:

C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow\Still Going\I will run out of ideas soon\I have organizational problems\Obsessive compulsive subdirectory disorder\Here is a guid for no good reason\936DA01F-9ABD-4d9d-80C7-02AF85C822A8\Almost there\Tax Returns\2013\2013_tax_return.pdf

Ta pełna ścieżka do pliku ma 290 znaków. Powłoka (Eksplorator Windows) i większość narzędzi wiersza poleceń prawdopodobnie nie pozwoli ci go dotknąć.

Użyj substpolecenia w następujący sposób:

subst X: "C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow"

Teraz możesz uzyskać dostęp do (i usunąć, przenieść itp.) Pliku w ten sposób:

X:\Still Going\I will run out of ideas soon\I have organizational problems\Obsessive compulsive subdirectory disorder\Here is a guid for no good reason\936DA01F-9ABD-4d9d-80C7-02AF85C822A8\Almost there\Tax Returns\2013\2013_tax_return.pdf

A teraz ta nazwa pliku ma tylko ~ 235 znaków, więc nie będziesz już mieć problemów z „Nazwa pliku jest za długa”.

W Windows API istnieje niesławna stała znana jako MAX_PATH. MAX_PATH ma 260 znaków. System plików NTFS obsługuje ścieżki do 32 767 znaków. Nadal możesz używać 32 767 długich nazw ścieżek, uzyskując dostęp do wersji funkcji Windows API Unicode (lub „szerokich”), a także przez prefiks ścieżki \\?\.

MAX_PATHzostał osadzony w kamieniu bardzo dawno temu w świecie Windows. Myślę, że ma to coś wspólnego ze standardami ANSI w tamtym czasie ... ale to jedna z tych rzeczy, które Microsoft bardzo trudno zmienić teraz, ponieważ teraz mamy tysiące programów i aplikacji, w tym niektóre napisane przez samych Microsoft, które używają MAX_PATHi zawiódłby w dziwny, nowy sposób, gdyby stała została nagle zmieniona. (Przepełnienia bufora, uszkodzenie sterty itp.)

Ryan Ries
źródło
9
Podjąłem podejście podobne do substkorzystania z połączeń katalogowych, które mogą być wygodniejsze w czyszczeniu, jeśli chcesz tylko wprowadzić kilka szybkich zmian. Używam łącza Shell Extension , ale można po prostu użyć mklinkpolecenia tak: mklink /J C:\Wow "C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow".
Charles Grunwald
10

Można obejść to ograniczenie, używając notacji \\? \ C:. Jest brzydki, ale obsługuje pliki o długości do 2 ^ 15.

http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx#maxpath

Chris K.
źródło
2
Tak, przeczytałem to, jak powiedziałem (patrz mój link). Ale jak mogę z tego dokładnie skorzystać? Czy mogę na przykład zamapować dysk na \\? \ Coś. Nie rozumiem. Artykuł jest przeznaczony dla programistów używających interfejsów API systemu Windows. Podczas gdy piszę kod w .NET, w miarę potrzeby, nie używam C ++ itp. I nie widzę, jak to jest istotne dla pracowników moich klientów, którzy używają Eksploratora Windows i wspólnego okna plików itp.
Christopher Edwards
1
Ostatecznie nie ma. : - / Niestety
Chris K
@ChristopherEdwards Można tworzyć połączenia do punktów znajdujących się niżej w hierarchii folderów.
Hubert Kario
1
@ChristopherEdwards możesz zrobić link c:\usr-datado `c: \ Users \ VeryLongUserName \ LongFolderName` i powiedzieć mu, aby używał tego pierwszego, ale jeśli regularnie nazywa foldery 40-
cio znakowymi
2
7-zip z przyjemnością przegląda i kopiuje w notacji \\? \ C: pod względem wartości.
Matt Lyons,
9

Firma Microsoft ma teraz dostępną poprawkę na ten początek w systemie Windows 10, co wyjaśniono w artykule MSDN Pliki, ścieżki i przestrzenie nazw .

darthcoder już odpowiedział ze szczegółami dotyczącymi \\?\C:obejścia notacji, ale jest teraz klucz rejestru, przy pomocy HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)którego można usunąć ograniczenia MAX_PATH dla pojedynczego systemu. W artykule wspomniano również o wsparciu dla kontroli zasad grupy w Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long pathsorganizacji lub implementacji w całej grupie, jeśli to konieczne.

JimNim
źródło
Nie miałem czasu na dokładne testowanie, ale do tej pory widziałem mieszane wyniki tego rozwiązania i nie mogę potwierdzić, że rozwiązuje to problem Eksploratora Windows [plik].
JimNim
2
Nie działa to w Eksploratorze plików, ponieważ chociaż system i NTFS mogą obsługiwać długie ścieżki, Explorer nie może, dopóki sam nie zostanie ponownie zakodowany.
ingyhere
PS, będziesz musiał użyć jednego z programów do kopiowania w tym łączu SO na Eksploratorze, aby faktycznie działał.
ingyhere
1
Dobra informacja! W takim razie prawdopodobnie będę się trzymać Robocopy.
JimNim,