Копирование, удаление, перемещение файлов с отображением процесса


Ответ: Вы можете легко копировать, удалять, перемещать файлы, используя API-функции CopyFile, DeleteFile, и MoveFile. Эти функции легко использовать, но они не выводят на дисплей ход выполнения операциии. Вот примеры их работы.

// копирует SOURCE.TXT в DEST.TXT, аргумент FALSE сообщает отмену
// операции если DEST.TXT уже существует. CopyFile возвращает значение BOOL
if( CopyFile("C:\\SOURCE.TXT","C:\\DEST.TXT", FALSE) == FALSE)
Application->MessageBox("CopyFile failed", "Error", MB_OK);
// MoveFile и DeleteFile также возвратят FALSE если операция не выполнилась.
MoveFile("C:\\SOURCE.TXT","C:\\WINDOWS\\TEMP\\DEST.TXT");
DeleteFile("C:\\SOURCE.TXT");

Эти функции удобны, но к сожалению они не отображают "летящие папки" (ход выполнения). Чтобы получить "летящие папки", Вы должны использовать API-функцию SHFileOperation. Вышеупомянутые примеры приведены ниже, и показавают использование SHFileOperation. Обратите внимание, что в командах копирования и перемещения , можно задать необходимые каталоги.

// make sure to include the file SHELLAPI.H. Its located in the
// INCLUDE\WIN32 file if you're curious.
#include <shellapi.h>
// скопировать SOURCE.TXT в DEST.TXT;
char *From = "C:\\SOURCE.TXT\0";
char *To = "C:\\DEST.TXT\0";
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd = Handle; // Handle of main form or the application
op.wFunc = FO_COPY;
op.pFrom = From;
op.pTo = To;
op.fFlags= 0;
SHFileOperation( &op);
// переместить SOURCE.TXT в папку WINDOWS\TEMP
char *From = "C:\\SOURCE.TXT\0"; char *To = "C:\\WINDOWS\\TEMP\0"; SHFILEOPSTRUCT op; ZeroMemory(&op, sizeof(op)); op.hwnd = Handle; op.wFunc = FO_MOVE; op.pFrom = From; op.pTo = To; op.fFlags= 0; SHFileOperation( &op); // послать все .tmp файлы в корзину
char *File = "C:\\windows\\temp\\*.TMP\0"; SHFILEOPSTRUCT op; ZeroMemory(&op, sizeof(op)); op.hwnd = Handle; op.wFunc = FO_DELETE; op.pFrom = File; op.fFlags= FOF_ALLOWUNDO; SHFileOperation( &op); // скопировать все текстовые файлы из корненвого каталога // диска в папку temp. char *From = "C:\\*.TXT\0"; char *To = "C:\\WINDOWS\\TEMP\0"; SHFILEOPSTRUCT op; ZeroMemory(&op, sizeof(op)); op.hwnd = Handle; op.wFunc = FO_COPY; op.pFrom = From; op.pTo = To; op.fFlags= 0; SHFileOperation( &op);

Пояснение:

1: Когда вы выбиратете FO_DELETE (удаление), файлы будут перемещены в корзину, если флаг fFlags содержит значение FOF_ALLOWUNDO. В противном случае они будут удалены.

2: Строки структуры pFrom и pTo являются указателями на строку символов. Это не массивы. Они должны содержать указатель на строку, но структура не выделяет памяти для помещения в нее строк.
Не делайте так
:

op.pFrom = "C:\\*.TXT";
op.pTo = "C:\\TEMP";

3: Обратите внимание на дополнительный нулевой признак конца (добавленный с помощью '\0') в строках имени файла. Документация MSDN заявляет, что pTo и pFrom должны быть законченны c двойным null указателем.

4: Строки, на которые указывают pFrom и pTo могут содержать больше чем одну строку. Каждая строка должна быть отделена нулевым символом. Двойной нулевой символ, упомянутый выше, используется, чтобы закончить полный список. Вот — пример:

char *From = "C:\\*.txt\0C:\\*.log\0C:\\*.tmp\0";
op.pFrom = From;
// объявление From может быть немного проще, если использовать пробелы
char *From = "C:\\*.txt\0"
 "C:\\*.log\0"
"C:\\*.tmp\0";

5: При копировании или перемещении файлов, стиль FOF_RENAMEONCOLLISION в параметре fFlags будет препятствовать функции перезаписывать существующие с таким именем файлы. Оболочка создаст копии, типа "Копия readme.txt" (это так делает explorer ).

6: Вы можете также использовать FO_RENAME как wFunc параметр. fFlags параметр может содержать много других расширенных стилей. Для получения дополнительной информации прочитайте WIN32.HLP



Copyright © 1997-2000 by Harold Howe. bcbdev.com
All rights reserved.
Переведено для сайта http://cbuilder.ru