Конференция "WinAPI" » Как Windows переименовывает файлы при совпадении во время копиров [NT4, Win2k, WinXP]
 
  • Badevlad (16.10.09 18:56) [0]
    При копировании Windows переименовывает файл, в случае если его имя совпадает с именем присутствующего в папке файла. К примеру, если в папке есть "Файл1.txt", и мы пытаемся скопировать в нее еще один с таким же именем, второй файл будет переименован в "Копия Файл1.txt". при очередном совпадении имя будет "Копия (2) Файл1.txt" и т. д.

    Как получить шаблон, по которому Windows строит новое имя файла? Мне нужно самостоятельно генерировать его с учетом языка Windows, так что варианты с FOF_RENAMEONCOLLISION или забиванием констант не подходят.
  • DVM © (16.10.09 19:29) [1]
    в Shell32.dll есть строковой ресурс 4178, выглядит похоже: Копия ()
  • Игорь Шевченко © (16.10.09 23:37) [2]
    Windows не переименовывает файл во время копирования
  • Badevlad (17.10.09 15:13) [3]
    DVM, спасибо, но вряд ли я могу на это положиться. Нужна какая-нибудь системная функция или константа.

    Игорь, что Вы имеете в виду?
  • Игорь Шевченко © (17.10.09 16:49) [4]

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


    Я имею в виду, что команда copy, системная функция CopyFile, проводник, если набрать в одном каталоге Copy, а в другом Paste не переименовывают файлы, если в каталоге назначения уже имеются файлы с такими же именами.
  • DVM © (17.10.09 17:12) [5]

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

    Так я константу и привел. Функции нету, есть функция с пом которой можно достать эту строку из ресурса.
    API для этой цели быть не может, ибо это функционал проводника и не обязан быть документирован. Проще взять ShFileOperation() она и скопирует с нужными именами все.
  • DVM © (17.10.09 17:14) [6]

    > Badevlad   (17.10.09 15:13) [3]

    Проще простого выяснить где лежит нужная строка в разных версия windows и подгружать оттуда по мере необходимости.
  • Eraser © (17.10.09 19:01) [7]
    > [3] Badevlad   (17.10.09 15:13)


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

    при первом запуски проги создаешь во временной папке файл X, потом с пом. ShFileOperation копируешь файл "в самого себя" и пом. рег. выражений и FindFirst/Next узнаешь искомую строку.
  • Badevlad (18.10.09 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 © (18.10.09 00:38) [9]
    > [8] Badevlad   (18.10.09 00:25)


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

    с пом. регулярных выражений, как я и описал выше. для первой копии можно просто писать как есть.
  • DVM © (18.10.09 00:54) [10]

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

    Единственно верное решение - взять оттуда же откуда берет проводник. Если окажется что номер ресурса в разных версиях Win разный - значит для разных версий брать свои номера.
  • Eraser © (18.10.09 02:07) [11]
    > [10] DVM ©   (18.10.09 00:54)


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

    может оказаться, что номер ресурса разный в разных билдах эксплорера.
  • Германн © (18.10.09 02:31) [12]

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

    Имхо.
    Если API Shell32 не предоставляет такой возможности, то никаких "нормальных" путей нет.
  • Badevlad (18.10.09 11:21) [13]

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


    Логично. Я и ищу такую фкункциональность API. Может кто-то знает что-то, чего я не знаю. Может есть какие-то слабодокументированные функции или их параметры?
  • DVM © (18.10.09 14:47) [14]

    > Badevlad   (18.10.09 11:21) [13]


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

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

    Нет таких функций. Не нужны они потому что.
  • qwer_qwer (18.10.09 18:44) [15]

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


    Имена копируемых файлов выьбираются именно способом перебора (счётчик).
  • Игорь Шевченко © (18.10.09 19:02) [16]
    Собственно, никто не мешает организовать такое переименование вручную, с нужными именами копий, не обязательно искать ресурсы в shell32.dll
    Internet Explorer, например, в своем кэше при дублировании имен пишет номер в имени файла file[n] - вполне себе удобно и не зависит от локализации
  • DVM © (18.10.09 20:49) [17]

    > qwer_qwer   (18.10.09 18:44) [15]


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

    Да ему нужно именно слово "Копия" получить как то для конкретной локализации Windows.
 
Конференция "WinAPI" » Как Windows переименовывает файлы при совпадении во время копиров [NT4, Win2k, WinXP]
Есть новые Нет новых   [134433   +21][b:0][p:0.001]