Вот мои куски.
Это показывание ошибки, ими напичканы все функции, потому проще выложить чем оттуда убирать
bool __stdcall OdLib::GetErrorText(char *ErrText, DWORD dwLastError)
{
if(!dwLastError) return false;
HMODULE hModule = NULL; // default to system source
LPSTR MessageBuffer;
//char * ErrText;
DWORD dwBufferLength;
DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM ;
//
// If dwLastError is in the network range,
// load the message source.
//
if(dwLastError >= NERR_BASE && dwLastError <= MAX_NERR) {
hModule = LoadLibraryEx(
TEXT("netmsg.dll"),
NULL,
LOAD_LIBRARY_AS_DATAFILE
);
if(hModule != NULL)
dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;
}
//
// Call FormatMessage() to allow for message
// text to be acquired from the system
// or from the supplied module handle.
//
dwBufferLength = FormatMessageA(
dwFormatFlags,
hModule, // module to get message from (NULL == system)
dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language
(LPSTR) &MessageBuffer,
0,
NULL);
if(!dwBufferLength)
{
return NULL;
}
else
{
strcpy(ErrText, MessageBuffer);
LocalFree(MessageBuffer);
}
//
// If we loaded a message source, unload it.
//
if(hModule != NULL)
FreeLibrary(hModule);
return true;
//
}
//----------------------------------------------------------------------------
void __stdcall OdLib::DisplayErrorText(DWORD dwLastError)
{
char ErrText[500];
if(GetErrorText(ErrText, dwLastError))
{
MessageBox(NULL,ErrText,"SystemError",MB_OK|MB_ICONERROR);
}
}
//----------------------------------------------------------------------------
void __stdcall OdLib::ShowLastError()
{
DisplayErrorText(GetLastError());
}
//----------------------------------------------------------------------------
Определение файл или папка
bool __stdcall OdLib::IsFile(const char *FileName, bool ShowErrorOnFail)
{
HANDLE File;
WIN32_FIND_DATA FD;
File = FindFirstFile(FileName, &FD); // найти файл
if(File==INVALID_HANDLE_VALUE || FD.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY){
if(ShowErrorOnFail) ShowLastError();
return false; // если не найден или папка, функция неуспешна
}
if(!FindClose(File)){ // закрываем хэндл поиска
if(ShowErrorOnFail) ShowLastError();
return false;
}
return true; // функция успешна
}
//----------------------------------------------------------------------------
bool __stdcall OdLib::IsDir(const char *DirName, bool ShowErrorOnFail){
HANDLE File;
WIN32_FIND_DATA FD;
File = FindFirstFile(DirName, &FD); // найти файл
if(File==INVALID_HANDLE_VALUE || FD.dwFileAttributes!=FILE_ATTRIBUTE_DIRECTORY){
if(ShowErrorOnFail) ShowLastError();
return false; // если не найден или папка, функция неуспешна
}
if(!FindClose(File)){ // закрываем хэндл поиска
if(ShowErrorOnFail) ShowLastError();
return false;
}
return true; // функция успешна
}
Собственно работа с папками
bool __stdcall OdLib::DeleteDir(char *Path, bool ShowErrorOnFail)
{
//строка пути должна заканчиваться
//двумя нулями, что и делается т.е.
//добавляется еще 1 '\0'
char *IPath; //строка пути должна заканчиваться
IPath = (char*)malloc(lstrlen(Path)+2); //двумя нулями, что и делается в
strcpy(IPath,Path); //первых четырех строках т.е.
IPath[lstrlen(IPath)+1]='\0'; //добавляется еще 1 '\0'
SHFILEOPSTRUCT strFileOp; //заполняем параметры структуры
strFileOp.hwnd = NULL;
strFileOp.wFunc = FO_DELETE;
strFileOp.pFrom = IPath;
strFileOp.pTo = NULL;
if(!ShowErrorOnFail) strFileOp.fFlags = FOF_NOCONFIRMATION|FOF_NOERRORUI;
else strFileOp.fFlags = FOF_NOCONFIRMATION;
if(!SHFileOperation(&strFileOp)) return false;
free(IPath);
return true;
}
//----------------------------------------------------------------------------
bool __stdcall OdLib::CopyDir(char *From, char *To, bool ShowErrorOnFail)
{
//строка пути должна заканчиваться
//двумя нулями, что и делается т.е.
//добавляется еще 1 '\0'
char *IFrom; //строка пути должна заканчиваться
IFrom = (char*)malloc(lstrlen(From)+2); //двумя нулями, что и делается в
strcpy(IFrom,From); //первых четырех строках т.е.
IFrom[lstrlen(IFrom)+1]='\0'; //добавляется еще 1 '\0'
char *ITo; //строка пути должна заканчиваться
ITo = (char*)malloc(lstrlen(To)+2); //двумя нулями, что и делается в
strcpy(ITo,To); //первых четырех строках т.е.
ITo[lstrlen(ITo)+1]='\0'; //добавляется еще 1 '\0'
if(!IsDir(To))
{
MakeDir(To);
}
SHFILEOPSTRUCT strFileOp; //заполняем параметры структуры
strFileOp.hwnd = NULL;
strFileOp.wFunc = FO_COPY;
strFileOp.pFrom = IFrom;
strFileOp.pTo = ITo;
if(!ShowErrorOnFail) strFileOp.fFlags = FOF_NOCONFIRMATION|FOF_NOERRORUI;
else strFileOp.fFlags = FOF_NOCONFIRMATION;
if(!SHFileOperation(&strFileOp)) return false;
free(IFrom);
free(ITo);
return true;
}
//----------------------------------------------------------------------------
bool __stdcall OdLib::MakeDir(char *Dir, bool ShowErrorOnFail)
{
if(!IsDir(Dir))
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = false;
if(!CreateDirectory(Dir,&sa))
{
if(ShowErrorOnFail) ShowLastError();
return false;
}
}
return true;
}
//----------------------------------------------------------------------------