![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как 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, выглядит похоже: Копия ()