Udostępnij za pośrednictwem


Ograniczenie maksymalnej długości ścieżki

W interfejsie API systemu Windows (z pewnymi wyjątkami opisanymi w poniższych akapitach) maksymalna długość ścieżki to MAX_PATH, która jest zdefiniowana jako 260 znaków. Ścieżka lokalna jest ustrukturyzowana w następującej kolejności: litera dysku, dwukropek, ukośnik odwrotny, składniki nazw oddzielone ukośnikami odwrotnymi i znakiem zerowym zakończenia. Na przykład maksymalna ścieżka na dysku D to "D:\jakiś ciąg ścieżki 256 znaków<NUL>" gdzie "<NUL>" reprezentuje niewidoczny znak zerowy zakończenia dla bieżącej strony kodowej systemu. (Znaki <> są używane tutaj w celu zachowania przejrzystości wizualnej i nie mogą być częścią prawidłowego ciągu ścieżki).

Na przykład możesz osiągnąć to ograniczenie, jeśli klonujesz repozytorium git, które ma długie nazwy plików w folderze, który ma długą nazwę.

Nuta

Funkcje we/wy plików w interfejsie API systemu Windows konwertują znak "/" na "\" w ramach konwertowania nazwy na nazwę w stylu NT, z wyjątkiem przypadków używania prefiksu "\\?\" zgodnie z opisem w poniższych sekcjach.

Interfejs API systemu Windows ma wiele funkcji, które mają również wersje Unicode, aby zezwolić na rozszerzoną ścieżkę 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, z których każdy do wartości zwracanej w lpMaximumComponentLength parametru getVolumeInformation funkcji (ta wartość jest często 255 znaków). Aby określić ścieżkę o długości rozszerzonej, użyj prefiksu "\\?\". Na przykład "\\\?\D:\bardzo długą ścieżkę".

Nuta

Maksymalna ścieżka 32 767 znaków jest przybliżona, ponieważ prefiks "\\?\" może zostać rozszerzony do dłuższego ciągu przez system w czasie wykonywania, a rozszerzenie to ma zastosowanie do całkowitej długości.

Prefiks "\\?\" może być również używany ze ścieżkami skonstruowanymi zgodnie z uniwersalną konwencją nazewnictwa (UNC). Aby określić taką ścieżkę przy użyciu unc, użyj prefiksu "\\?\UNC\". Na przykład "\\?\UNC\server\share", gdzie "serwer" to nazwa komputera, a "udział" to nazwa folderu udostępnionego. Te prefiksy nie są używane jako część samej ścieżki. Wskazują one, że ścieżka powinna zostać przekazana do systemu z minimalną modyfikacją, co oznacza, że nie można użyć ukośników do reprezentowania separatorów ścieżek lub kropki reprezentujące bieżący katalog lub podwójne kropki do reprezentowania katalogu nadrzędnego. Ponieważ nie można użyć prefiksu "\\?\" ze ścieżką względną, ścieżki względne są zawsze ograniczone do całkowitej liczby znaków MAX_PATH.

Nie ma potrzeby przeprowadzania normalizacji Unicode w ciągach nazw ścieżek i plików do użycia przez funkcje interfejsu API we/wy plików systemu Windows, ponieważ system plików traktuje ścieżkę i nazwy plików jako nieprzezroczystą sekwencję WCHARs. Każda normalizacja wymagana przez aplikację powinna być wykonywana z tą myślą, poza wszelkimi wywołaniami powiązanymi funkcjami interfejsu API we/wy plików systemu Windows.

W przypadku tworzenia katalogu przy użyciu interfejsu API określona ścieżka nie może być tak długa, że nie można dołączyć nazwy pliku 8.3 (oznacza to, że nazwa katalogu nie może przekraczać MAX_PATH minus 12).

Powłoka i system plików mają różne wymagania. Istnieje możliwość utworzenia ścieżki przy użyciu interfejsu API systemu Windows, którego interfejs użytkownika powłoki nie może poprawnie interpretować.

Włączanie długich ścieżek w systemie Windows 10 w wersji 1607 i nowszych

Począwszy od systemu Windows 10 w wersji 1607, MAX_PATH ograniczenia zostały usunięte z wielu typowych funkcji plików i katalogów Win32. Jednak aplikacja musi wyrazić zgodę na nowe zachowanie.

Aby włączyć nowe zachowanie długiej ścieżki dla aplikacji, należy spełnić dwa warunki. Należy ustawić wartość rejestru, a manifest aplikacji musi zawierać element longPathAware.

Ustawienie rejestru umożliwiające włączenie długich ścieżek

Ważny

Zrozumienie, że włączenie tego ustawienia rejestru będzie miało wpływ tylko na aplikacje, które zostały zmodyfikowane, aby korzystać z nowej funkcji. Deweloperzy muszą zadeklarować, że ich aplikacje mają mieć długą świadomość ścieżki, zgodnie z opisem w ustawieniach manifestu aplikacji poniżej. Nie jest to zmiana, która wpłynie na wszystkie aplikacje.

Wartość rejestru HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD) musi istnieć i być ustawiona na wartość 1. Wartość rejestru będzie buforowana przez system (na proces) po pierwszym wywołaniu objętej funkcji pliku lub katalogu Win32 (zobacz poniżej, aby uzyskać listę funkcji). Wartość rejestru nie zostanie ponownie załadowana w okresie istnienia procesu. Aby wszystkie aplikacje w systemie rozpoznawały wartość, może być wymagane ponowne uruchomienie, ponieważ niektóre procesy mogły zostać uruchomione przed ustawieniem klucza.

Możesz również skopiować ten kod do pliku .reg, który może go ustawić, lub użyć polecenia programu PowerShell w oknie terminalu z podwyższonym poziomem uprawnień:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001

Nuta

To ustawienie rejestru można również kontrolować za pomocą zasad grupy w Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths. Zasady można również stosować w usłudze Microsoft Intune przy użyciu programu Policy Configuration Service Provider (CSP).

Aktualizacje manifestu aplikacji w celu deklarowania możliwości długiej ścieżki

Manifest aplikacji musi również zawierać element longPathAware.

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

Funkcje bez ograniczeń MAX_PATH

Są to funkcje zarządzania katalogami, które nie mają już MAX_PATH ograniczeń, jeśli zdecydujesz się na zachowanie długiej ścieżki: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.

Są to funkcje zarządzania plikami, które nie mają już MAX_PATH ograniczeń, jeśli zdecydujesz się na zachowanie długiej ścieżki: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.

Zobacz też

funkcje zarządzania plikami

funkcje zarządzania katalogami

GetVolumeInformation