Вопрос в том, почему ограничение все еще существует. Конечно, современные 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и называет это днем.