|
| gliba 06.12.2006 02:47 Задача "Как скопировать файл с CD-ROM'а в приложении MFC" содержит одну "проблемку", адрес CD-ROM заранее неизвестен. Не беда.
Есть функция, позволяющая получить маску доступных дисков.
DWORD GetLogicalDrives(VOID);
Диску 'a:' соответствует бит с позицией 0, диску 'b:' соответствует бит с позицией 1, диску 'c:' соответствует бит с позицией 2 и т.д.
Есть функция, определюящая тип диска.
UINT GetDriveType(
LPCTSTR lpRootPathName //указатель корневой директории
);
Если код возврата равен DRIVE_CDROM, то это CDROM-диск.
И есть функция для копирования.
BOOL CopyFile(
LPCTSTR lpExistingFileName, //указатель на исходный файл
LPCTSTR lpNewFileName, //указатель на выходной файл
BOOL bFailIfExists //если не ноль и выходной файл существует, то ошибка
);
Алгоритм. В цикле создаем адрес логического диска. Если это CDROM, формируем полный путь, ищем файл на этом диске. Если файл найден, копируем
его. Цикл продолжаем пока не найдем файл или не переберем все диски в системе.
В итоге получаем
//csIn - полный путь к исходному файлу за вычетом логического диска
//csOut - выходной файл
int CTest1Dlg::copyFileFromCD( const CString & csIn, const CString & csOut )
{
CFileFind ff;
CString s;
TCHAR szLogDrive[100];
int nDriveNumber;
DWORD dwDriveMask = GetLogicalDrives();
for (nDriveNumber = 0; dwDriveMask != 0; )
{
//создать адрес логического диска
wsprintf( szLogDrive, _T("%c:\"), (TCHAR) (_T('A') + nDriveNumber) );
if( GetDriveType(szLogDrive) == DRIVE_CDROM )
{ //это CDROM
s = szLogDrive;
s += csIn;
if( ff.FindFile( s ) )
{ //файл найден, копировать
BOOL bRes = CopyFile( s, csOut, FALSE );
if( bRes ) return 1; //успех
}
}
nDriveNumber++; //увеличить номер диска
dwDriveMask >>= 1; //сдвинуть маску
}
return 0; //ошибка
}
Замечания.
CFileFind - класс для поиска файлов.
Если вы не исключаете возможность локализации ваших программ в других странах, то для работы с текстами целесообразно использовать Юникод
(Unicode - 2-х байтовая кодировка символов). MFC имеет набор функций, которые в зависимости от директивы препроцессора, определяющей тип
платформы, работают с однобайтовой, многобайтовой или Юникод кодировкой.
Так для ANSI и DBCS платформ TCHAR определяется:
typedef char TCHAR;
Для Unicode:
typedef WCHAR TCHAR;
|