Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какая максимальная длина пути файла? 
V
    Опции темы
Alca
Дата 11.12.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Какая максимальная длина пути файла? (все версии Windows, FAT16, FAT32, NTFS)?
Уже нашел ответ:
Сравнение_файловых_систем

Добавлено через 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

Это сообщение отредактировал(а) Alca - 11.12.2008, 16:10


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 11.12.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(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 не пишите так программы!
PM MAIL Skype GTalk   Вверх
Alca
Дата 11.12.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Почему?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alek86
Дата 11.12.2008, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 11.12.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



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

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

Добавлено через 43 секунды
хуже всего когда человек что-то делает и при этом не знает что он делает =)
PM MAIL Skype GTalk   Вверх
Alca
Дата 11.12.2008, 17:27 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



А я думаю что ему нет чем заняться!

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

Это сообщение отредактировал(а) Alca - 11.12.2008, 17:34


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 11.12.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



надо, но вот только использовать GlobalAlloc для этого вряд-ли стоит...
PM MAIL Skype GTalk   Вверх
Alca
Дата 11.12.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Чем GlobalAlloc не подходит?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 11.12.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Тем что она оставлена для совместимости с 16-ти битным кодом, это всего-лишь враппер, который вызывает HeapAlloc с дефолтной кучей процесса.
А в данном примере достаточно malloc - free.
PM MAIL Skype GTalk   Вверх
12345qwerty12345
Дата 18.3.2016, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 17.3.2016

Репутация: нет
Всего: нет



В теории ограничение на длину имени файла или папки в 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]. Убедительная просьба не какать предложениями типа "укоротите имена", "юзайте файловые менеджеры" и "юзайте коммандную строку с символами \\?\". Никто юзать ни файловые менеджеры ни  коммандную стоку не собирается, только проводник в графическом интерфейсе. Предложения в стиле «укоротите имена» меня вообще бесят, там и так уже все срезано по максимуму. Жду конкретные предложения по сути вопроса на свою почту.



Это сообщение отредактировал(а) 12345qwerty12345 - 18.3.2016, 06:23

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  СЛУЖБА_АКТИВАЦИИ_WINDOWS.jpg 29,75 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0993 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.