Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Какая максимальная длина пути файла?


Автор: Alca 11.12.2008, 16:09
Какая максимальная длина пути файла? (все версии Windows, FAT16, FAT32, NTFS)?
Уже нашел ответ:
http://ru.wikipedia.org/wiki/Сравнение_файловых_систем

Добавлено через 12 минут и 9 секунд
Нашел прикольную статейку, может кому сгодится:
Цитата

Превышение максимальной длины пути в файловых системах Windows

Как известно, длина имени файла в Windows ограничена 256 символами. В программировании используется константа MAX_PATH, которая равна 260. Судя по названию, она означает максимальную длину пути в Windows, которая складывается из максимальной длины имени каталога 255 символов + слэш на конце + завершающий нулевой символ, и из символов, означающих букву диска в количестве трёх штук (например, "C:\"). Всё это вместе даёт длину пути 260. На самом деле это ограничение в 260 символов есть только в Windows API. В самой файловой системе (FAT32 или NTFS) максимальная длина имени файла ограничена 255 символами, но максимальная длина пути может быть гораздо больше, чем поддерживает WinAPI. Поэтому, ограничение на длину пути может быть преодолено. Посмотрим, что об этом сказано в документации. 

The wide (Unicode) versions of the CreateDirectory, FindFirstFile, GetFileAttributes, and SetFileAttributes functions permit paths that exceed the MAX_PATH length if the path has the "\\?\" or "\\?\UNC\" prefix. These prefixes direct the functions to turn off path parsing. Use the "\\?\" prefix with paths for local storage devices and the "\\?\UNC\" prefix with paths having the Universal Naming Convention format. 

Unicode-версии функций CreateDirectory, FindFirstFile, GetFileAttributes, и SetFileAttributes позволяют использовать пути, превышающие длину MAX_PATH, если путь имеет префикс "\\?\" or "\\?\UNC\". Эти префиксы указывают функции на необходимость отключения проверки пути. Используйте "\\?\" префикс для путей на локальных носителях, а "\\?\UNC\" для путей, которые имеют UNC-формат. 

То есть, ничто не мешает нам, используя префикс "\\?\", создать путь с длиной большей, чем 260 символов. 

Я написал небольшую программу, которая создаёт на диске С: много вложенных друг в друга каталогов "next". Программа прекращает создавать каталоги, если функция CreateDirectory вернула FALSE (достигнут предел длины пути в используемой файловой системе), или переполнился буфер, использованный для хранения пути (по-умолчанию - 32 кб). 

Я протестировал программу на Windows XP Pro SP2 Rus, первый раз на диске C:\, где у меня используется NTFS, а второй раз на дискете, где FAT16. На FAT32 разделах не проверял, так как у меня на компьютере таких нет. На дискете удалось создать путь длиной примерно 32000 символов. При этом таблица размещения файлов так разрослась, что заняла 264 килобайта! При этом никаких больше файлов на дискете не было - только вложенные пустые каталоги. 

Не знаю, связано ли это как-то с моими экспериментами над файловой системой, но после создания длинного пути на диске C:\, мой компьютер сам собой два раза перезагрузился. Потом я из защищённого режима удалил все эти вложенные каталоги, и комп больше себя так не ведёт. Возможно, это никак не связано с превышением максимальной длины пути, возможно это просто глюки железа моего не совсем нового компьютера.

Код

#define UNICODE
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <stdio.h>
#include <string.h>

int wmain() {

    wchar_t *longpath = (wchar_t *) GlobalAlloc(GPTR, 32768);

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

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

    int pathsize = wcslen(longpath);
    int nextsize = wcslen(next);
    const int maxpath = 32768;

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

    return 0;
}

http://amdf.pp.ru/longpath.php

Автор: Lazin 11.12.2008, 16:32
Цитата(Alca @  11.12.2008,  16:09 Найти цитируемый пост)
#define UNICODE
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <string.h>
int wmain() {
    wchar_t *longpath = (wchar_t *) GlobalAlloc(GPTR, 32768);
    wcscpy(longpath,L"\\\\?\\C:\\");
    const wchar_t next[] = L"LONGLONGLONG\\";
    int pathsize = wcslen(longpath);
    int nextsize = wcslen(next);
    const int maxpath = 32768;
    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);
    return 0;
}

2All не пишите так программы!

Автор: Alca 11.12.2008, 16:45
Почему?

Автор: Alek86 11.12.2008, 17:07
думаю, Lazin имел в виду, что приведенный код очень грязен и неудобен как для чтения так и для изменений

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

Автор: Lazin 11.12.2008, 17:21
И еще вот это
Цитата(Lazin @  11.12.2008,  16:32 Найти цитируемый пост)
GlobalAlloc

непонятно зачем...

Добавлено через 43 секунды
хуже всего когда человек что-то делает и при этом не знает что он делает =)

Автор: Alca 11.12.2008, 17:27
А я думаю что ему нет чем заняться!

Добавлено @ 17:31
Память под указатель выделять не надо?

Автор: Lazin 11.12.2008, 18:30
надо, но вот только использовать GlobalAlloc для этого вряд-ли стоит...

Автор: Alca 11.12.2008, 18:38
Чем GlobalAlloc не подходит?

Автор: Lazin 11.12.2008, 21:46
Тем что она оставлена для совместимости с 16-ти битным кодом, это всего-лишь враппер, который вызывает HeapAlloc с дефолтной кучей процесса.
А в данном примере достаточно malloc - free.

Автор: 12345qwerty12345 18.3.2016, 06:18
В теории ограничение на длину имени файла или папки в NTFS составляет 255 символов, но на практике Windows API ограничивает до 244 символов (мне удалось создать). 
В теории ограничение на длину пути к файлу или папке в NTFS составляет 32767 символов, но на практике Windows API ограничивает до 245 символов (мне удалось создать).

Как видно из вышеуказанной Alca статьи весь корень зла не в файловой системе а в Windows API.
Если ограничение на длину имени файла или папки в Windows API на практике в 244 символа меня вполне устраивает, то ограничение на длину пути к файлу или папке в Windows API на практике в 245 символов ни меня ни большинсто пользователей не устраивает.
У меня риторический вопрос к программистам :
Можно ли внести самодельные изменения в Windows API после включения "Службы активации Windows" через "Компоненты Windows" ??? Если возможно то как конкретно ???
Если у кого-то есть конкретные предложеня по поводу "службы активации" и самодельной правки "Windows API" прошу писать мне на почту [email protected]. Убедительная просьба не какать предложениями типа "укоротите имена", "юзайте файловые менеджеры" и "юзайте коммандную строку с символами \\?\". Никто юзать ни файловые менеджеры ни  коммандную стоку не собирается, только проводник в графическом интерфейсе. Предложения в стиле «укоротите имена» меня вообще бесят, там и так уже все срезано по максимуму. Жду конкретные предложения по сути вопроса на свою почту.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)