[personal profile] borislvin
Вопрос комьпьютерного ламера: как устроено ограничение на размеры имени файлов в Windows?

Периодически сталкиваюсь с проблемой, когда система отказывается копировать файлы, ссылаясь на слишком длинное название. При этом она прекрасно их сохраняет с этими названиями, и так же прекрасно перемещает между директориями. А вот копировать - отказывается.

Приходится идти кривым путем, то есть вместо простого копирования файла из директории А в директорию Б - открывать файл и сохранять его заново в нужной директории.

Как такое может быть? Может быть, где-то выставлено специальное ограничение на длину имени копируемого файла, и можно это ограничение подредактировать, выставив его таким же, как ограничение на длину имени файла при сохранении и перемещении?

Date: 2014-04-29 06:16 pm (UTC)
From: [identity profile] lev-usyskin.livejournal.com
экое у вас пристрастие к гекзаметру!

Date: 2014-04-29 06:19 pm (UTC)
From: [identity profile] ygam.livejournal.com
Ох, don't get me started.

http://msdn.microsoft.com/en-us/library/aa365247.aspx
Edited Date: 2014-04-29 06:20 pm (UTC)

Date: 2014-04-29 06:40 pm (UTC)
From: [identity profile] bbb.livejournal.com
Ну вот я посмотрел, что там написано - но ответа на свой вопрос не увидел :(

Date: 2014-04-29 06:57 pm (UTC)
From: [identity profile] scolar.livejournal.com
Он там есть, между тем: были (и остаются) старые API, у которых есть ограничение длины пути в 260 символов. Многие программы до сих пор пользуются этими классическими API (вполне возможно, что и утилиты, которыми вы пытаетесь копировать). При копировании длина пути может увеличиться (C:\Users\bbb\Documents\VeryLongNameAlmost260SymbolsTotal.docx ещё влезает, а попытка скопировать его в C:\Users\bbb\Documents\2014\April\VeryLongNameAlmost260SymbolsTotal.docx приводит к ошибке).

В то же время, есть более новые API, которые поддерживают суммарную длину пути 32,767 символов. Если программа (например, Word) пользуется ими, то она может создать файл, который старые API не могут.

Date: 2014-04-29 07:08 pm (UTC)
From: [identity profile] bbb.livejournal.com
Наверно, вы правы. Просто я по неопытности думал, что одна и та же программа (конкретно, родной виндоуз эксплорер) и для копирования, и для перемещения использует какую-то одну и ту же внутреннюю машинерию. На самом деле, видимо - разную.

Date: 2014-04-29 07:43 pm (UTC)
From: [identity profile] dasblinkenlight.livejournal.com
Точно, разную.

Для копирования нужно один файл открыть для чтения, второй для записи, и циклом копировать из первого во второй, пока файл не закончится. После этого оба файла надо закрыть.

Для перемещения внутри одного логического диска нужно просто сказать файловой системе откуда и куда переносится файл, и система его перенесёт, не открывая.

Иногда перенос файла требует копирования - например, при перемещении между жестким и сетевым дисками, или при копировании на другой логический диск.

Date: 2014-04-29 10:11 pm (UTC)
From: [identity profile] bbb.livejournal.com
Понял, спасибо.

Date: 2014-04-30 06:38 am (UTC)
From: [identity profile] pargentum.livejournal.com
Кстати, еще гипотеза - у вас стоит какой-то shell extension, который участвует в копировании, но не в переносе.
Это более правдоподобно, чем старые API в самом эксплорере.

Date: 2014-04-30 02:43 pm (UTC)
From: [identity profile] akovalenko.livejournal.com
И ещё гипотеза: при переносе содержимое переносимых каталогов, собственно, никак не обрабатывается: если мы переносим /очень/длинное/имя из каталога /одно в каталог /другое, в рамках этой операции ни разу не строится полный путь /другое/очень/длинное/имя -- причём этот путь не только ни разу не передаётся в вызове ядра, его даже внутри ядра-то незачем строить. Подкаталог перемещается в другое место коррекцией ссылок в родительских каталогах, в его содержимое никто не вникает.

Можно представить себе организацию каталогов, которая могла бы отслеживать образование слишком длинных имён и при перемещении. Но это непросто и небесплатно в смысле производительности.

(Если бы речь шла о Linux VFS layer, была бы не гипотеза, а инфа 100%. В случае Windows, пожалуй, всё-таки гипотеза, но я очень удивлюсь, если она не соответствует действительности).

Date: 2014-04-29 08:42 pm (UTC)
From: [identity profile] fyysik.livejournal.com
есть еще тонкий момент. Русские буквы и прочие умляуты ныне занимают в два раза больше места. В некоторых ситуациях.

Date: 2014-04-29 10:31 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
С чего бы это, винда перешла на УТФ-8 ?

Date: 2014-04-30 05:27 am (UTC)
From: [identity profile] fyysik.livejournal.com
там не UTF-8 а UTF-2/16 оно же widechar. Начиная с Win 95 переходят.

Date: 2014-04-29 11:43 pm (UTC)
From: [identity profile] ygam.livejournal.com
Нет. Внутри NTFS все UTF-16.

Date: 2014-04-29 10:32 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
это в смысле "потянул файл мышкой" для копирования и вызвался эйпиай, который не может осилить длинный путь?

Date: 2014-04-29 06:21 pm (UTC)
From: [identity profile] pargentum.livejournal.com
По идее, ограничение простое: 256 символов UTF-16.
Есть подозрение, что что-то у вас не так просто с объектами копирования.
Например, не находится ли одна из папок, куда или откуда вы копируете, на сетевом диске?

Date: 2014-04-29 06:40 pm (UTC)
From: [identity profile] bbb.livejournal.com
Нет, этот феномен никак не связан с тем, где расположены директории.

Date: 2014-04-29 06:45 pm (UTC)
From: [identity profile] davnym-davno.livejournal.com
Я тоже не эксперт, но могу поделиться опытом. Длинные названия файлов обычно содержат знаки препинания. А по знакам препинания есть ограничения. Нужно либо найти директорию с минимальными ограничениями, либо убрать из названия файла знаки препинания. В любом случае в названии файла не стоит иметь слэш и двоеточие - может возникнуть путаница при определении пути к файлу.

Date: 2014-04-29 06:53 pm (UTC)
From: [identity profile] bbb.livejournal.com
Нет, никаких знаков препинания в моих названиях файлов нет. Все упирается исключительно в ограничение по длине. И даже не столько в ограничение по длине, сколько в разнобой между этими ограничениями для разных операций. Если бы система изначально отказывалась сохранять файл с данным именем - я бы, конечно, придумал имя поменьше. А так файл сохраняется, перемещается из директории в директорию, но не копируется.

Date: 2014-04-29 07:02 pm (UTC)
From: [identity profile] davnym-davno.livejournal.com
тогда это - не ограничения по длине, а что-то другое.
Если у Вас не "семерка", а более поздняя версия Виндовс, то может быть это - просто глюки неотлаженной ОС. Попробуйте обратиться в техподдержку.

Date: 2014-04-29 06:52 pm (UTC)
From: [identity profile] yba.livejournal.com
Там ограничение на общую длину пути - фолдер + файл не больше 255 символов

Date: 2014-04-29 06:54 pm (UTC)
From: [identity profile] yba.livejournal.com
+ есть способы обхода ограничения, соответственно операция создания может использовать этот способ, а операция копирования - нет. я сам такое видел

Date: 2014-04-29 06:57 pm (UTC)
From: [identity profile] bbb.livejournal.com
Где - "там"?

И почему операция перемещения осуществляется (причем всегда осуществляется), а операция копирования - нет?

Date: 2014-04-29 06:56 pm (UTC)
From: [identity profile] mikhail edoshin (from livejournal.com)
У них ограничение на общую длину пути. Внутри лимитов вообще два -- один маленький, 260 символов, другой большой-большой, примерно 32 тысячи символов. Какой именно применяется, зависит от того, какие именно вызываются функции (каждая функция для текста существует в двух вариантах, ASCII и Unicode) и того, как именно программа формирует строку (для того, чтобы применялся большой лимит, нужно начать путь с особого префикса). Скорее всего, копирующий код упирается в нижний лимит, а перемещающий написан иначе. Это несколько странно, потому что программа (Explorer, Проводник) одна, но вполне может быть. (Вы именно файл перемещаете или же папку с файлами? Путь к папке может быть короче.) А сохраняющий код даже и не Проводник, а чем вы там сохраняете -- MS Word, например; его еще один человек писал. Сделать ничего нельзя, только более короткие имена использовать.

Вы как копируете, кстати -- перетаскиваете между окнами или же командами скопировать/вставить?

Date: 2014-04-29 07:02 pm (UTC)
From: [identity profile] bbb.livejournal.com
Перетаскивается по-всякому - и целиком папками, и индивидуально, и между окнами, и командами (только не скопировать/вставить, а удалить/вставить, Ctrl-X/Ctrl-V)

А файлы чаще всего pdf.

Видимо, вы правы - придется смириться с несовершенством мира :(((

Date: 2014-04-29 06:57 pm (UTC)
From: [identity profile] sli1234.livejournal.com
очевидно что при копировании которым вы пользуетесь используется старый гавнокод в котором закодено некое максимальное число безотносительно к файловой системе, при всех остальных операциях она просто вызывает операции файловой системы и файловая система сама скажет если ей имя длинным кажется

точно можно сказать одно - имя не может быть длиннее примерно 32 000 символов, это ограничение внутренних структур системы

Date: 2014-04-29 07:00 pm (UTC)
From: [identity profile] taki-net.livejournal.com
Что значит "система" - копирует не система, а программа. Имеется в виду Проводник (Explorer)? Как в нем делается перемещение? Пееретаскиванием с зажатой ПРАВОЙ кнопкой или?

Date: 2014-04-29 07:05 pm (UTC)
From: [identity profile] bbb.livejournal.com
Ну не придирайся к словам ламера :)

Да, я говорю про виндоуз эксплорер. Перемещение в нем можно делать как чисто мышью (только с зажатой ЛЕВОЙ кнопкой - при зажатой ПРАВОЙ кнопке выскакивает меню, спрашивающее, что именно я хочу делать, перемещать или копировать), так и командами Ctrl-X/Ctrl-V

Date: 2014-04-29 08:01 pm (UTC)
From: [identity profile] taki-net.livejournal.com
И при обоих методах копирование не идет, а перемещение идет?

Date: 2014-04-29 10:14 pm (UTC)
From: [identity profile] bbb.livejournal.com
Ага.

Но я, почитавши умных людей, решил поиграть и посмотреть, как оно устроено - и экспериментально обнаружил, что успешность копирования таких файлов может зависеть от общей длины его имени (в смысле path, с именами всех вложенных директорий). То есть файл может копироваться в директорию первого уровня от корневой, но не копироваться в директорию, скажем, третьего или пятого уровня.

Но перемещение срабатывает всегда.

Date: 2014-04-29 10:33 pm (UTC)
From: [identity profile] rudnev.livejournal.com
воспроизвелось в эксплорере.

total commander на сверхдлинное имя предупредил и скопировал.
в общем, я бы всячески его для юзерских файловых операций рекомендовал. там можно фильтры настраивать, в разные цвета раскрашивать файлы и папки, держать открытыми 10+ табов одновременно, просматривать содержимое файла без открытия. во всем сразу не разберетесь, конечно, но оно стоит для библиотек и более того, способствует правильной ее организации.

и еще - вы наверняка адоб акробатом пдфы открываете, по пять минут? есть такой sumatrapdf для винды броузер, он очень быстрый.

Date: 2014-04-29 10:49 pm (UTC)
From: [identity profile] bbb.livejournal.com
Насчет тотал коммандера - подумаю. У меня проблема в том, что на работе я не имею админправ на компьютере, и установка любого нового софта в нашей огромной конторе - долгая головная боль.

А вот акробат pdf открывает и обрабатывает со свистом, никаких проблем.

Date: 2014-04-30 04:56 am (UTC)
From: [identity profile] yura-sh.livejournal.com
А с флешки total commander запускать не получится?

Profile

borislvin

May 2025

S M T W T F S
    123
45678910
111213 14 151617
18192021222324
25262728293031

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 29th, 2025 03:42 am
Powered by Dreamwidth Studios