Описание используемых классов и структур
SHFILEOPSTRUCT
Структура SHFILEOPSTRUCT используется в настольных приложениях и содержит все необходимые поля для работы функции SHFileOperation (копирование, перемещение и удаление файлов и папок, а так же деревьев каталогов с вложенными каталогами и файлами).
typedef struct SHFILEOPSTRUCT {
HWND hwnd;
UINT wFunc;
PCZZTSTR pFrom;
PCZZTSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
PCTSTR lpszProgressTitle;
}
В данном примере поле wFunc принимает значение FО_COPY.
ОПИСАНИЕ АЛГОРИТМА РАБОТЫ
В программе реализованы следующие функции:
А) BOOL IsDriveReady(char DriveLetter);
Б) void flash_copy(char n);
В) void main().
А) В функции void main() находится цикл, который отправляет заявки на проверку существования диска по заданному тому. Если диск подключен, то для этого тома вызывается функция копирования всей информации находящейся на флэшке. По завершении копирования в консоль выводится сообщение о завершении копирования с данного устройства. После чего переходит к следующему тому. Если не было найдено ни одного устройства, то функция продолжает ожидать его подключения. Если же было найдено хотя бы одной устройство, происходит выход из цикла. Далее программа предлагает просканировать подключенные устройства еще раз.
Б) В функции BOOL IsDriveReady(char DriveLetter) происходит проверка наличия уствройства по заданному тому. В качестве аргумента функция принимает символ тома и формирует имя директории. При попытке обратиться к новой директории идет проверка на ошибку номер 3, т.е. ошибка о необнаружении файлов по заданной директории. При существовании usb устройства функция вернет true, иначе false.
В) В функции void flash_copy(char n) реализовано копирование целого дерева каталогов с файлами. В качестве аргумента функция принимает символ тома, по адресу которого находится устройство. Для использования функции ShFileOperation необходимо заполнить вспомогательную структуру ShFileOpStruct. Для этого прописывается адрес, куда необходимо скопировать информацию, формируется имя директории, откуда будет происходить копирование, установка функции FO_COPY и флага FOF_NOCONFIRMATION.
КОД ПРОГРАММЫ
#include "objbase.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include<winbase.h>
#include<windows.h>
#include <shellapi.h>
#include <iostream>
#include <fstream>
#include <windows.h>
#include <dbt.h>
BOOL IsDriveReady(char DriveLetter)
{
WORD OldErrorMode;
TCHAR OldDirectory[255];
TCHAR NewDirectory[3];
OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
GetCurrentDirectory(255,(LPTSTR)OldDirectory);
NewDirectory[0] = DriveLetter;
NewDirectory[1] = ':';
NewDirectory[2] = '\\';
SetCurrentDirectory((LPTSTR)NewDirectory);
if (GetLastError() == 3) //3 - код ошибки "необнаружен диск"
{
SetCurrentDirectory((LPTSTR)OldDirectory);
SetErrorMode(OldErrorMode);
return FALSE;
}else
{
SetCurrentDirectory((LPTSTR)OldDirectory);
SetErrorMode(OldErrorMode);
return TRUE;
}
}
void flash_copy(char n)
{
SHFILEOPSTRUCT fa;
ZeroMemory(&fa, sizeof(fa));
switch(n)
{
case 'f':
fa.pFrom = L"f:\\";
break;
case 'g':
fa.pFrom = L"g:\\";
break;
case 'h':
fa.pFrom = L"h:\\";
break;
case 'i':
fa.pFrom = L"i:\\";
break;
}
fa.fFlags =FOF_NOCONFIRMATION;
fa.hwnd = 0;
//fa.pFrom = L"f:\\";
fa.pTo = L"c:\\111\\";
fa.wFunc = FO_COPY;
int nRes = ::SHFileOperation(&fa);//копирование папки
}
void main()
{
int q=1, a=1;
printf("Waiting...\n");
do{
while(q==1)
{
if(IsDriveReady('f'))
{
flash_copy('f');
printf("f to copy\n");
q=0;
}
if(IsDriveReady('g'))
{
flash_copy('g');
printf("g to copy\n");
q=0;
}
if(IsDriveReady('h'))
{
flash_copy('h');
printf("h to copy\n");
q=0;
}
if(IsDriveReady('i'))
{
flash_copy('i');
printf("i to copy\n");
q=0;
}
}
q=1;
printf("Again? 1/0\n");
scanf("%d",&a);
}while(a==1);
}
5 SCREENSHOTS
Рис. 1 Программа обнаружила устройство и начала копирование
Рис. 2 Программа завершила копирование диска f и предлагает повторить поиск устройств
Рис. 3 Пустая папка – до начала работы программы
Рис. 4 Диск f – до начала работы программы
Рис. 5 Одна из папок диска f – до начала работы программы
Рис. 6 Уже не пустая папка – после работы программы
Рис. 7 Результат работы программы (файлы во всех сохраненных подкаталогах)
ЗАКЛЮЧЕНИЕ
В программе были реализованы все требуемые функции. В ходе выполнения данной работы я получила углубленные знания о языке С++.
Использование высокоуровнего языка программирования C++ делают код понятным для программиста и легко модифицируются.
СПИСОК ЛИТЕРАТУРЫ
Microsoft Developer Network [Электронный ресурс]. – Электронные данные. – Режим доступа: http://msdn.microsoft.com/
Wikipedia [Электронный ресурс]. – Электронные данные. – Режим доступа: http://ru.wikipedia.org/