Обмеження імені шляху в вікні 256 символів


17

після довгого дослідження я нарешті з'ясував, що імена шляхів не можуть бути довші 256 символів навіть в останніх Microsoft Windows 7. Я дійсно не розумію, чому існує таке дурне обмеження, оскільки NTFS може обробляти до ~ 32 000 символів довжина без жодних проблем вже більше десятка років! Чи немає можливості змінити це? Або є якісь практичні рішення, щоб цього уникнути?

260 символів - дуже мало для навіть простих випадків використання, як-от вкладені каталоги фотографій з довгими іменами файлів.


1
Я думаю, що турбота полягає в тому, що існують старіші програми, які мають жорстке уявлення про те, як довгий має бути шлях, так що якщо ви спробуєте використовувати їх на більш довгих шляхах, вони вибухнуть цікавими способами.
dsolimano

Чи є у ОС Linux ця проблема?
ahorn

Відповіді:


18

За даними Microsoft:

  • Традиційний API Windows обмежує імена шляхів до 260 символів, навіть для програм, розроблених для останньої версії.

  • Програми, що використовують API, орієнтований на Unicode, можуть використовувати форму шляху, яка містить до 32767 символів. Ім'я файлу має бути встановлено з префіксом \\?\і повинно бути абсолютним шляхом, наприклад, \\?\c:\dir\fileабо \\?\UNC\server\share\file. Є додаткові обмеження, див. Посилання на деталі.

Якщо вам вдалося створити та використовувати глибоку ієрархію файлів і вам потрібно працювати з додатком, який вибухає через довжину імені файлу, ви можете спробувати кілька речей:

  • Використовуйте mklinkкоманду для створення символічних посилань та пропустіть шлях, який використовує їх, до вашої програми.

  • Використовуйте substкоманду, щоб призначити букву диска директорії.

  • Запустіть свою програму з глибокого каталогу та пройдіть її короткими відносними шляхами.

  • Замініть кілька довгих імен на 8.3 псевдоніми ( micros~1), припускаючи, що вони все ще існують у Windows 7. Якщо у вас є micros~1поряд micros~2, я не знаю, як сказати, що є; можливо, запустіть DOS command.com(знову ж таки, припускаючи, що Windows 7 все ще може це зробити).


3
Ну, навіть Windows Explorer з Win7, здається, використовує традиційний API! Це шкода.

3
Ще більше зворотних нахилів `\\? \` :-)
Дзвінок Ø

@Gilles, Чи мікрос ~ 1 і мікрос ~ 2 стандартизовані у всіх системах чи це випадково?
Pacerier

@Pacerier Те, що було створено першим, потрапляє в каталог micros~1, тому воно по суті є випадковим.
Жил "ТАК - перестань бути злим"

0

Ви можете використовувати короткі (8.3) імена для всіх своїх папок і файлів.

Вам потрібно переконатися, що вони включені.

Довгим ім'ям файлу вважається будь-яке ім'я файлу, яке перевищує короткий режим іменування стилів MS-DOS (його також називають 8.3). Як правило, Windows зберігає на диску довгі імена файлів у вигляді спеціальних записів каталогів, які можуть бути відключені загальносистемними з міркувань продуктивності залежно від конкретної файлової системи. Коли ви створюєте довге ім'я файлу, Windows також може створити коротку форму 8.3 імені, що називається псевдонімом 8.3, і також зберегти його на диску. Цей псевдонім 8.3 можна вимкнути для визначеного обсягу.

(мій сміливий)

Вам також доведеться написати якийсь код, щоб отримати коротке ім’я від довгого імені.

Джерело


2
хаха ... Я добре пам'ятаю ці дні в Windows 95, коли всі ми отримали цей супер-пупер FAT32 з 256 символами довгих імен! Це було фантастично (в ці дні), і я дуже шокований тим, що обмеження в назві файлу можуть бути проблемою в ці дні. 2010 рік! Windows справді архаїчна ...

0

Ім'я файлу / каталогу в NTFS обмежено 255 кодовими точками unicode, оскільки довжина зберігається як байт. Але немає загальної межі загальної довжини шляху.

Багато дзвінків API Win32 (включаючи оболонку Explorer) мають обмеження довжини 260-1. Деякі інші виклики мають можливість використовувати префікс \\? \, Щоб отримати до 32 К (трохи менше, оскільки ім'я гучності замінюється в Kernel-land)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.