Ograniczenie nazwy ścieżki Windows 256 znaków

17

po długich badaniach w końcu odkryłem, że nazwy ścieżek nie mogą być dłuższe niż 256 znaków, nawet w najnowszym systemie Microsoft Windows 7. Naprawdę nie rozumiem, dlaczego istnieją takie głupie ograniczenia, ponieważ NTFS może obsłużyć ścieżkę do ~ 32 000 znaków długość bez problemu od kilkunastu lat! Czy nie ma takiej możliwości? Czy są jakieś praktyczne rozwiązania, aby tego uniknąć?

260 znaków to bardzo niewiele, nawet w prostych przypadkach użycia, takich jak niektóre zagnieżdżone katalogi zdjęć z długimi nazwami plików.

Beznadziejny
źródło
1
Myślę, że zmartwienie polega na tym, że istnieją starsze programy, które na stałe mają wyobrażenie o tym, jak długa powinna być ścieżka, więc jeśli spróbujesz użyć ich na dłuższych ścieżkach, wybuchną one w interesujący sposób.
dsolimano
Czy system operacyjny Linux ma ten problem?
ahorn

Odpowiedzi:

18

Według Microsoft:

  • Tradycyjny interfejs API systemu Windows ogranicza nazwy ścieżek do 260 znaków, nawet w przypadku aplikacji opracowanych dla najnowszej wersji.

  • Aplikacje korzystające z interfejsu API obsługującego Unicode mogą używać formy ścieżki, która pozwala na maksymalnie 32767 znaków. Nazwa pliku musi być poprzedzona prefiksem \\?\i musi być ścieżką bezwzględną, np . \\?\c:\dir\fileLub \\?\UNC\server\share\file. Istnieją dalsze ograniczenia, szczegółowe informacje można znaleźć w odnośniku.

Jeśli udało Ci się stworzyć i używać głębokiej hierarchii plików i musisz pracować z aplikacją, która bombarduje z powodu długości nazwy pliku, możesz spróbować kilku rzeczy:

  • Użyj mklinkpolecenia, aby utworzyć dowiązania symboliczne i przekaż ścieżkę, która ich używa, do aplikacji.

  • Użyj substpolecenia, aby przypisać literę dysku do katalogu.

  • Uruchom aplikację z głębokiego katalogu i przekaż mu krótkie ścieżki względne.

  • Zastąp niektóre długie nazwy ich aliasami 8.3 ( micros~1), zakładając, że nadal istnieją one w systemie Windows 7. Jeśli masz micros~1obok micros~2, nie wiem, jak powiedzieć, który jest który; być może uruchom DOS command.com(ponownie, zakładając, że Windows 7 nadal może to zrobić).

Gilles „SO- przestań być zły”
źródło
3
Cóż, nawet Eksplorator Windows z Win7 wydaje się używać tradycyjnego API! Szkoda.
3
Jeszcze więcej odwrotnych ukośników `\\? \` :-)
Pierścień Ø
@Gilles, Czy micros ~ 1 i micros ~ 2 są znormalizowane w różnych systemach, czy jest losowy?
Pacerier
@Pacerier Niezależnie od tego, który katalog został utworzony jako pierwszy micros~1, jest on zasadniczo losowy.
Gilles „SO- przestań być zły”
0

Możesz użyć krótkich (8.3) nazw dla wszystkich swoich folderów i plików.

Musisz jednak upewnić się, że są one włączone.

Długa nazwa pliku jest uważana za dowolną nazwę pliku, która przekracza krótką konwencję nazewnictwa w stylu MS-DOS (zwaną także 8.3). Zazwyczaj system Windows przechowuje długie nazwy plików na dysku jako specjalne pozycje katalogu, które można wyłączyć w całym systemie ze względu na wydajność w zależności od konkretnego systemu plików. Podczas tworzenia długiej nazwy pliku system Windows może również utworzyć krótką formę 8.3, zwaną aliasem 8.3, i zapisać ją również na dysku. To 8.3 aliasing można wyłączyć dla określonego woluminu.

(mój pogrubienie)

Musisz również napisać kod, aby uzyskać krótką nazwę z długiej nazwy.

Źródło

ChrisF
źródło
2
lol ... dobrze pamiętam te dni w Windows 95, kiedy wszyscy dostaliśmy ten superduperatowy FAT32 z długimi nazwami plików 256 znaków! To było fantastyczne (w dzisiejszych czasach) i jestem naprawdę zszokowany, że ograniczenia nazw plików nadal mogą być problemem w tych dniach. 2010! Windows jest naprawdę archaiczny ...
0

Nazwa pliku / katalogu w systemie plików NTFS jest ograniczona do 255 znaków kodowych Unicode, ponieważ długość jest przechowywana jako bajt. Ale nie ma nieodłącznego ograniczenia całkowitej długości ścieżki.

Wiele wywołań interfejsu API API (w tym powłoki eksploratora) ma limit długości 260–1. Niektóre inne wywołania mają możliwość użycia przedrostka \\? \, Aby uzyskać do 32 KB (nieco mniej, ponieważ nazwa woluminu zostaje podstawiona w Kernel-land)

Dominik Weber
źródło