Вопрос в том, почему ограничение все еще существует. Конечно, современные Windows могут увеличить сторону, MAX_PATH
чтобы позволить более длинные пути. Почему ограничение не было снято?
- Причина, по которой его нельзя удалить, заключается в том, что Windows пообещала, что это никогда не изменится.
Благодаря контракту API, Windows гарантировала всем приложениям, что стандартные файловые API никогда не будут возвращать путь длиннее 260
символов.
Рассмотрим следующий правильный код:
WIN32_FIND_DATA findData;
FindFirstFile("C:\Contoso\*", ref findData);
Windows гарантировала моей программе, что она заполнит мою WIN32_FIND_DATA
структуру:
WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
//...
TCHAR cFileName[MAX_PATH];
//..
}
Мое приложение не объявляло значение константы MAX_PATH
, а Windows API. Мое приложение использовало это определенное значение.
Моя структура правильно определена, и только выделяет 592
всего байтов. Это означает, что я могу получить только имя файла, которое меньше 260
символов. Windows пообещала мне, что если я напишу свое приложение правильно, оно продолжит работать в будущем.
Если бы Windows разрешала имена файлов длиннее 260
символов, то мое существующее приложение (которое правильно использовало правильный API) не получилось бы.
Любой, кто призывает Microsoft изменить MAX_PATH
константу, сначала должен убедиться, что ни одно из существующих приложений не выходит из строя. Например, я все еще владею и использую приложение Windows, которое было написано для работы в Windows 3.11. Он по-прежнему работает на 64-битной Windows 10. Это то, что дает вам обратная совместимость.
Microsoft сделал создать способ использовать полные имена путей 32768; но они должны были создать новый контракт API для этого. Во-первых, вы должны использовать Shell API для перечисления файлов (поскольку не все файлы существуют на жестком диске или в сетевой папке).
Но они также должны не нарушать существующие пользовательские приложения. Подавляющее большинство приложений не используют API оболочки для работы с файлами. Каждый просто звонит FindFirstFile
/ FindNextFile
и называет это днем.