Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.01;
Скачать: CL | DM;

Вниз

Как Windows переименовывает файлы при совпадении во время копиров   Найти похожие ветки 

 
Badevlad   (2009-10-16 18:56) [0]

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

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


 
DVM ©   (2009-10-16 19:29) [1]

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


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

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


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

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

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


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


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


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


 
DVM ©   (2009-10-17 17:12) [5]


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

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


 
DVM ©   (2009-10-17 17:14) [6]


> Badevlad   (17.10.09 15:13) [3]

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


 
Eraser ©   (2009-10-17 19:01) [7]

> [3] Badevlad   (17.10.09 15:13)


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

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


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

> Игорь Шевченко ©
> Я имею в виду, что команда 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-18 00:38) [9]

> [8] Badevlad   (18.10.09 00:25)


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

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


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


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

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


 
Eraser ©   (2009-10-18 02:07) [11]

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


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

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


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


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

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


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


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


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


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


> Badevlad   (18.10.09 11:21) [13]


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

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

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


 
qwer_qwer   (2009-10-18 18:44) [15]


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


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


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

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


 
DVM ©   (2009-10-18 20:49) [17]


> qwer_qwer   (18.10.09 18:44) [15]


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

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



Страницы: 1 вся ветка

Текущий архив: 2012.04.01;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
3-1273743190
Роман
2010-05-13 13:33
2012.04.01
Подключение Delphi к базе Firebird


15-1323009404
Prok186
2011-12-04 18:36
2012.04.01
Работа в XE2 64bit с памятью более 4Gb


15-1323004190
DVM
2011-12-04 17:09
2012.04.01
Никто в MS не хочет пойти программировать? На Delphi.


2-1323443006
ply
2011-12-09 19:03
2012.04.01
Пример приложения на winapi


15-1322845352
paxpet
2011-12-02 21:02
2012.04.01
Можно ли увеличить размер шрифта в интерфесе delphi