Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как Windows переименовывает файлы при совпадении во время копиров [NT4, Win2k, WinXP]


Badevlad ©   (2009-10-16 18:56:00) 

При копировании Windows переименовывает файл, в случае если его имя совпадает с именем присутствующего в папке файла. К примеру, если в папке есть "Файл1.txt", и мы пытаемся скопировать в нее еще один с таким же именем, второй файл будет переименован в "Копия Файл1.txt". при очередном совпадении имя будет "Копия (2) Файл1.txt" и т. д.

Как получить шаблон, по которому Windows строит новое имя файла? Мне нужно самостоятельно генерировать его с учетом языка Windows, так что варианты с FOF_RENAMEONCOLLISION или забиванием констант не подходят.


DVM   (2009-10-18 20:49:00) [1]


> qwer_qwer   (18.10.09 18:44) [15]


> Имена копируемых файлов выьбираются именно способом перебора
> (счётчик).

Да ему нужно именно слово "Копия" получить как то для конкретной локализации Windows.


Игорь Шевченко   (2009-10-18 19:02:00) [2]

Собственно, никто не мешает организовать такое переименование вручную, с нужными именами копий, не обязательно искать ресурсы в shell32.dll
Internet Explorer, например, в своем кэше при дублировании имен пишет номер в имени файла file[n] - вполне себе удобно и не зависит от локализации


qwer_qwer   (2009-10-18 18:44:00) [3]


> очередном совпадении имя будет "Копия (2) Файл1.txt" и т.
>  д.


Имена копируемых файлов выьбираются именно способом перебора (счётчик).


DVM   (2009-10-18 14:47:00) [4]


> Badevlad   (18.10.09 11:21) [13]


> Может есть какие-то слабодокументированные функции или их
> параметры?

Совсем слабо слабо документированные если только :)

Нет таких функций. Не нужны они потому что.


Badevlad   (2009-10-18 11:21:00) [5]


> Имхо.
> Если API Shell32 не предоставляет такой возможности, то
> никаких "нормальных" путей нет.


Логично. Я и ищу такую фкункциональность API. Может кто-то знает что-то, чего я не знаю. Может есть какие-то слабодокументированные функции или их параметры?


Германн   (2009-10-18 02:31:00) [6]


> Badevlad   (18.10.09 00:25) [8]
>
> > Игорь Шевченко ©
> > Я имею в виду, что команда copy, системная функция CopyFile,
>
> > проводник, если набрать в одном каталоге Copy, а в другом
> Paste
> > не переименовывают файлы, если в каталоге назначения уже
> имеются
> > файлы с такими же именами.
>
> Копирование и вставка через буфер в проводнике а так же
> использование ShFileOperation с флагом FOF_RENAMEONCOLLISION
> переименовывают.

Имхо.
Если API Shell32 не предоставляет такой возможности, то никаких "нормальных" путей нет.


Eraser   (2009-10-18 02:07:00) [7]

> [10] DVM ©   (18.10.09 00:54)


> Если окажется что номер ресурса в разных версиях Win разный

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


DVM   (2009-10-18 00:54:00) [8]


> Очень некрасивое решение, но единственное пока, которое
> может сработать

Единственно верное решение - взять оттуда же откуда берет проводник. Если окажется что номер ресурса в разных версиях Win разный - значит для разных версий брать свои номера.


Eraser   (2009-10-18 00:38:00) [9]

> [8] Badevlad   (18.10.09 00:25)


> Вот если бы шаблон переименования как-то более определенно
> получить...

с пом. регулярных выражений, как я и описал выше. для первой копии можно просто писать как есть.


Badevlad   (2009-10-18 00:25:00) [10]

> Игорь Шевченко ©
> Я имею в виду, что команда copy, системная функция CopyFile,
> проводник, если набрать в одном каталоге Copy, а в другом Paste
> не переименовывают файлы, если в каталоге назначения уже имеются
> файлы с такими же именами.

Копирование и вставка через буфер в проводнике а так же использование ShFileOperation с флагом FOF_RENAMEONCOLLISION переименовывают.

> Eraser ©   (17.10.09 19:01) [7]
> при первом запуски проги создаешь во временной папке файл X,
> потом с пом. ShFileOperation копируешь файл "в самого себя"
> и пом. рег. выражений и FindFirst/Next узнаешь искомую строку.

Очень некрасивое решение, но единственное пока, которое может сработать. Есть, правда, нюанс: первая копия будет иметь имя "Копия Файла", а вторая — "Копия (2) Файла". Здесь могут быть свои нюансы для разных языков. В английском, например, будет "Copy of File" и "Copy (2) of File" соответственно.

Вот если бы шаблон переименования как-то более определенно получить...


Eraser   (2009-10-17 19:01:00) [11]

> [3] Badevlad   (17.10.09 15:13)


> Нужна какая-нибудь системная функция или константа.

при первом запуски проги создаешь во временной папке файл X, потом с пом. ShFileOperation копируешь файл "в самого себя" и пом. рег. выражений и FindFirst/Next узнаешь искомую строку.


DVM   (2009-10-17 17:14:00) [12]


> Badevlad   (17.10.09 15:13) [3]

Проще простого выяснить где лежит нужная строка в разных версия windows и подгружать оттуда по мере необходимости.


DVM   (2009-10-17 17:12:00) [13]


> DVM, спасибо, но вряд ли я могу на это положиться. Нужна
> какая-нибудь системная функция или константа.

Так я константу и привел. Функции нету, есть функция с пом которой можно достать эту строку из ресурса.
API для этой цели быть не может, ибо это функционал проводника и не обязан быть документирован. Проще взять ShFileOperation() она и скопирует с нужными именами все.


Игорь Шевченко   (2009-10-17 16:49:00) [14]


> Игорь, что Вы имеете в виду?


Я имею в виду, что команда copy, системная функция CopyFile, проводник, если набрать в одном каталоге Copy, а в другом Paste не переименовывают файлы, если в каталоге назначения уже имеются файлы с такими же именами.


Badevlad   (2009-10-17 15:13:00) [15]

DVM, спасибо, но вряд ли я могу на это положиться. Нужна какая-нибудь системная функция или константа.

Игорь, что Вы имеете в виду?


Игорь Шевченко   (2009-10-16 23:37:00) [16]

Windows не переименовывает файл во время копирования


DVM   (2009-10-16 19:29:00) [17]

в Shell32.dll есть строковой ресурс 4178, выглядит похоже: Копия ()


Наверх

Титульная страница Поиск, карта сайта Написать письмо