Ответ: Вы можете легко копировать, удалять, перемещать файлы, используя 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 |
Пояснение:
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