Питання в тому, чому обмеження все ще існує. Безумовно, сучасні 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, це зробив API Windows. Моя програма використовувала це визначене значення.
Моя структура правильно визначена і виділяє лише 592байти. Це означає, що я можу отримувати лише ім’я файлу, менший за кількість 260символів. Windows пообіцяла мені, що якщо я правильно напишу заявку, моя програма продовжуватиме працювати в майбутньому.
Якби Windows мала дозволити назви файлів довше, ніж 260символи, тоді мій існуючий додаток (який правильно використовував правильний API) не зможе.
Для всіх, хто закликає Microsoft змінити MAX_PATHконстанту, вони спочатку повинні переконатися, що жодна існуюча програма не працює. Наприклад, я все ще є власником і використовую додаток Windows, яке було написано для роботи в Windows 3.11. Він все ще працює у 64-розрядної Windows 10. Саме тому ви отримуєте зворотну сумісність.
Microsoft зробив створити спосіб використовувати повні імена шляхів 32768; але їм довелося створити новий контракт API, щоб це зробити. Для одного, ви повинні використовувати API Shell для перерахування файлів (оскільки не всі файли існують на жорсткому диску або спільній мережі).
Але вони також повинні не порушувати існуючі користувацькі програми. Переважна більшість додатків не використовують оболонки api для роботи з файлами. Усі просто дзвонять FindFirstFile/ FindNextFileі називають це щодня.