Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
MKN MKN вне форума

Ветеран


Сообщения: 2358
Благодарности: 559

Профиль | Отправить PM | Цитировать


Периодически необходимо перемещать или копировать файлы в папку, в которой уже имеются сотни файлов , в том числе и одноимённых (т.е. таких же, которые я копирую), которые потом нужно или удалить , или сравнить, или ещё чего...
Оказалось, сделать это удобно с помощью функции SHFileOperation, в которой предусмотрено создание копий одноимённых файлов.

Функция SHFileOperation копирует, перемещает, переименовывает или удаляет объект в файловой системе.
Функция имеет единственный аргумент - структуру типа TSHFileOpStruct, в которой и передаются все необходимые данные.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

В зависимости от установленных флагов, производятся нужные операции с файлами. К примеру :

переместить файлы из папки A в папку B и, если в папке B были одноимённые, файлы создать их копии в папке B

Код: Выделить весь код
System::Call "*(i $HWNDPARENT, i 0x0001, t 'C:\A\*.*',t 'C:\B', i 0x0008|0x0400, i0,i0,i0,&t${NSIS_MAX_STRLEN} r0,&t1 0)i .r0"
    System::Call "shell32::SHFileOperation(i r0)i .r1"
    System::Free $0
FO_MOVE = 0x0001 Перемеcтить файлы
Для копирования установить флаг FO_COPY = 0x0002 Копировать файлы
FOF_RENAMEONCOLLISION = 0x0008 В случае, если файл с данным именем уже существует, создается файл с именем "Copy #N of..."

Наиболее известно применение этой функции для удаления пустых каталогов. Но бывает полезен и такой момент - удаление файлов в корзину.
Например, при деинсталляции приложения, бывает необходимо сохранить пользовательские данные-файлы (проекты, шаблоны, INI, xml-файлы настроек и т.д.)
И , даже если в Uninstaller_е предусмотрено соответсвующее сообщение, можно случайно пропустить его и удалить нужные файлы.. Тогда беда (для рядового пользователя,точно...)
Поэтому, есть смысл, удалять ответственные файлы в корзину, с помощью SHFileOperation.

Код: Выделить весь код
    System::Call "*(i $HWNDPARENT, i 0x0003, t 'C:\A\*.*',t , i 0x0040|0x0010|0x0400, i0,i0,i0,&t${NSIS_MAX_STRLEN} r0,&t1 0)i .r0"
    System::Call "shell32::SHFileOperation(i r0)i .r1"
    System::Free $0
Здесь флаги :
FO_DELETE = 0x0003 - Удалить файлы
FOF_ALLOWUNDO = 0x0040 Удалить файлы в корзину.
FOF_NOERRORUI = 0x0400 - Не показывать сообщения об ошибках, которые могут возникнуть в течение процесса.
FOF_NOCONFIRMATION = 0x0010 Отвечает "yes to all" на все запросы в ходе операции, т.е. не спрашивать у пользователя подтверждения удаления.
если сообщение всё же желательно - этот флаг ессно не применяем

( Если надо удалить файлы вместе с папкой - не используем *.* )

Последний раз редактировалось MKN, 25-06-2014 в 15:15.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:38, 25-06-2014 | #1222