borislvin ([personal profile] borislvin) wrote2014-04-29 02:14 pm

Техницкое

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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