Яндекс.Метрика

    Windows

    Максимальная длина пути в NTFS

    В NTFS заложена поддержка длины пути больше, чем поддерживает Windows. В Windows длина пути ограничена константой MAX_PATH, равной 260 символам. Почему именно такое число, а не, скажем, 255?
    255 это, видимо, максимальная длина имени файла или каталога. Если это каталог, то, наверное, в путь ещё должен уместиться завершающий символ "\"; Прибавляем 1. Ещё три символа — для буквы диска. Прибавляем 3. Получается 259. Последний, 260-й символ, это, видимо, нулевой байт, завершающий строку.

    В MSDN сказано, что NTFS имеет следующие ограничения:

    Максимальная длина имени файла — 256 символов.
    Максимальная длина пути — 32,767 символов Юникода, при этом каждый компонент пути не превышает 255 символов.

    Я решил проверить, а возможно ли в Windows добраться до этого предела.
    В MSDN я нашёл информацию о том, что ограничение длины пути снимается, если использовать UNC-пути (это если в начале пути прибавить что-то типа \\?\).

    Я написал небольшую программку, которая создала на разделе NTFS путь длиной около 25994, после чего вывалилась с ошибкой (дело происходило под Win XP SP3). На более старых сервис-паках программа делает путь ещё длиннее, около 32000 символов.

    Вот её код:

    const int maxpath = 32768;
    wchar_t *longpath = (wchar_t *) GlobalAlloc(GPTR, maxpath);

    wcscpy(longpath,L"\\\\?\\C:\\");

    const wchar_t next[] = L"LONGLONGLONG\\";

    int pathsize = wcslen(longpath);
    int nextsize = wcslen(next);

    wcscat(longpath, next);

    while (pathsize < maxpath && CreateDirectory(longpath, NULL)) {
    pathsize += nextsize;
    wprintf(L"Path size: %u\n", pathsize);
    wcscat(longpath, next);
    }

    wprintf(L"\nDone.");

    GlobalFree(longpath);


    Каталог, содержащий столько вложенных друг в друга каталогов, не воспринимается системой нормально, например его не получается удалить из проводника, и перейти к самой последней папке тоже не получится.