3 травня 2014 р.

Обмеження на довжину шляху у назві файлів Windows до 260 знаків

Чи багато хто мав проблему що не може скопіювати, або відкрити файл у програмі, хоча бачимо що ось він є.
Чому таке стається ?
Деяку відповідь можна знайти у документах Microsoft : Naming Files, Paths, and Namespaces


Maximum Path Length Limitation

In the Windows API (with some exceptions discussed in the following paragraphs), the maximum length for a path is MAX_PATH, which is defined as 260 characters. A local path is structured in the following order: drive letter, colon, backslash, name components separated by backslashes, and a terminating null character. For example, the maximum path on drive D is "D:\some 256-character path string<NUL>" where "<NUL>" represents the invisible terminating null character for the current system codepage. (The characters < > are used here for visual clarity and cannot be part of a valid path string.) .

Note File I/O functions in the Windows API convert "/" to "\" as part of converting the name to an NT-style name, except when using the "\\?\" prefix as detailed in the following sections.

The Windows API has many functions that also have Unicode versions to permit an extended-length path for a maximum total path length of 32,767 characters. This type of path is composed of components separated by backslashes, each up to the value returned in the lpMaximumComponentLength parameter of the GetVolumeInformation function (this value is commonly 255 characters). To specify an extended-length path, use the "\\?\" prefix. For example, "\\?\D:\very long path".
Обмеження на максимальну довжину шляху
У Windows API , (з деякими винятками , обговорюваних в наступних пунктах) , максимальна довжина для шляху визначена у MAX_PATH , яка становить 260 символів. Локальний шлях структурований в наступному порядку: буква диска , двокрапка , коса риса , компоненти імені розділяються зворотного косою риси , і порожній символ завершення. Наприклад , максимальна шлях на диску D є "D:\деякий 256 - символьний рядок шляху <NUL> ",  де "<NUL> " представляє невидимий завершальний нульовий символ для поточної системної кодової сторінці. (Символи < > використовуються тут для чіткості і не може бути частиною допустимого рядку шляху.).
Примітка. Функції введення/виводу в API  Windows конвертують символ "/" до "\" в рамках перетворення імені в ім'я за NT-стилем, за винятком випадків використання префіксу "\\?\", як це описано в наступних розділах.
Windows API, має багато функцій, які також мають Unicode версії для розширення довжини шляху до максимальної загальної довжини у 32767 символів. Цей тип шляху складається з компонентів , розділених косими рисками, кожне значення, що повертається в параметрі "IpMaximumComponentLength" функції "GetVolumeInformation" (це значення зазвичай є 255 символів). Щоб вказати шлях розширеної довжини, використовуйте префікс "\\?\". Наприклад , "\\?\ D:\дуже довгий шлях".

 Виходячи з цього для обходу обмеження треба використати для щляху "C:\Users\Public\Documents\Тека для 2010\Палаш\001-555555555555555556-6666666666666666666\002-322565666565656565\003-6556ew5ew6e565we53s\9499494994-ddsdssds\5445454545\343343434332244\деякі документи\ще щось\документ для роботи при використанні у мовах збільшеного ризику використання тютюнопаління а ще чогось та іншого чогось таке собі довге ім'я для створення іміджу компанії.txt" - довжина шляху складає 382 знаки.

Отримаю збережену частину назви текстового файлу "документ для роботи при використанні у мовах збільше", навіть без типу. Що складає сумарну довжину у 260 знаків.

Обрізане ім'я файлу
Якщо створити файл окремо у іншій теці, і спробувати перемістити сюди бачимо наступну помилку.
Шлях призначення занадто довгий
 Але як використати довгий шлях ?

Спроба використати такий запис з префіксом \\?\ не дає користі при використанні Explorera Windows 7 .
"\\?\C:\Users\Public\Documents\Тека для 2010\Палаш\001-555555555555555556-6666666666666666666\002-322565666565656565\003-6556ew5ew6e565we53s\9499494994-ddsdssds\5445454545\343343434332244\деякі документи\ще щось\документ для роботи при використанні у мовах збільшеного ризику використання тютюнопаління а ще чогось та іншого чогось таке собі довге ім'я для створення іміджу компанії.txt"

А ось за допомогою програми  FAR 2.0.1420 х64 я таки скопіював задовгий файл!
Як з використанням префіксу \\?\ так і без нього.
Використання у FAR довгих шляхів у імені файлу
Тепер і Explorer Windows 7 показує цей файл, але працювати з ним не дає.

Файл скопійовано іншою програмою, але відображається.
Відкрити файл, не можливо.

Переглянемо як працюють у таких умовах інші програми, наприклад резервного копіювання та синхронізації.
Програма резервного копіювання Cobian Backup 11:

Використана тіньова копія, тека з архівована до архіву 7-Zip.
Перевіримо зміст архіву. Усе успішно.
Додатково перевірив що і 7-Zip самостійно працює з довгими шляхами.

Тепер черга за програмою "FreeFileSync 6.5". У описах програми заявлено: "Support long path names > 260 characters"
До синхронізації теки
Після синхронізації теки
Спроба видалити файли з використаннями "кошика", дає помилку
Відновлення фалів до теки з довгим шляхом.

Що ж робити зі звичайним Explorer Windows 7 ?

1. Не використовувати довгі назви.
2. Скоротити назви як файлів, так і вкладеності тек, або перемістити до тек з коротшою назвою.
3. Використати символічні посилання файлової системи NTFS:
3.1. Команда mklink
 3.2. Проргама  FAR, Alt-F6, створення посилання
FAR, Alt-F6, створення посилання
Після створення посилання, тека доступна для звичайної роботи за новим коротким шляхом "C:\temp\link\ще щось"


Посилання за темою:

Немає коментарів:


Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready