C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с файлами и папками  (Прочитано 21689 раз)
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« : 04 мая 2008, 09:36:54 »

Копирование директории с поддиректориями и файлами (VCL вариант):
Код
#include <SysUtils.hpp>
 
void CopyDirectory (AnsiString Src, AnsiString Dest)
{
 TSearchRec sr;
 if (FindFirst(Src+"\\*", faAnyFile, sr) == 0)
    {
      do
        {
          if (sr.Attr & faDirectory) // directory
             {
               if (sr.Name!=".")
               if (sr.Name!="..")
                  {
                    AnsiString SubFld = Src+"\\"+sr.Name;
                    if (!DirectoryExists(Dest+"\\"+ sr.Name))
                        CreateDir(Dest+"\\"+ sr.Name);
                    CopyDirectory (SubFld, Dest+"\\"+ sr.Name);
                  }
             }
          else // file
             {
               if (sr.Name!=".")
               if (sr.Name!="..")
                  {
                    AnsiString OldName = Src+"\\"+ sr.Name;
                    AnsiString NewName = Dest+"\\"+ sr.Name;
                    CopyFile(OldName.c_str(), NewName.c_str(), TRUE);
                  }
             }
         } while (FindNext(sr) == 0);
   FindClose(sr);
 }
}
 

пример вызова:
Код
CopyDirectory ("C:\\1", "D:"); // копирует директорию C:\1 на диск D
 
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #1 : 04 мая 2008, 09:49:00 »

Код
 
#include <SysUtils.hpp>
 
void FileList (AnsiString Dir)
{
 TSearchRec sr;
 if (FindFirst(Dir+"\\*.*", faAnyFile, sr) == 0) // можно задать маску для файлов, например: Dir+"\\*.txt"
    {
      do
        {
          if (!(sr.Attr & faDirectory))
               Memo1->Lines->Add(sr.Name.c_str();) // выводим в TMemo
        } while (FindNext(sr) == 0);
    }
 FindClose(sr);
}
 

пример вызова:

Код
FileList ("C:\\WINDOWS"); // выводит все файлы в папке C:\WINDOWS
 
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #2 : 06 мая 2008, 09:21:10 »

Цитата: _HmcmP_
Итеративный поиск каталогов.
Код
// Copyright by _HmcmP_
void search(AnsiString _path)
{
  TSearchRec sr;
  AnsiString path;
 
  list<AnsiString> L1,L2,temp;
  list <AnsiString>::iterator iter;
 
  path=_path;
  L2.push_back(path);
 
  while (!L2.empty())
  {
     temp=L1; L1=L2; L2=temp;
     while (!L1.empty())
     {
        iter=L1.begin();
        path=*iter;
        L1.pop_front();
 
        if (FindFirst(path+"\\*",0x10,sr)==0)
        {
           do
           {
              if (sr.Attr & 0x10 && sr.Name!="." && sr.Name!="..")
              {
                 L2.push_back(path+"\\"+sr.Name);
                 frmMain->mmFiles->Lines->Add(sr.Name); // output in TMemo
              }
           }
           while (FindNext(sr)==0);
        }
     }
  }
  FindClose(sr);
} // search
 

Автору благодарности и зачот!
Записан
AVC
Администратор
***

Сказали спасибо: +28/-6
Offline Offline

Сообщений: 1189


« Ответ #3 : 06 мая 2008, 16:59:30 »

Еще вариант
Код:
//---------------------------------------------------------------------------
// Групповые операции с файлами
//---------------------------------------------------------------------------
#include <shellapi.h>

void __fastcall TForm1::Bt_SHFOperClick(TObject *Sender)
{
AnsiString base_path = ExtractFilePath(Application->ExeName); // "drv:\dir\dir\"
AnsiString from;
AnsiString to;
SHFILEOPSTRUCT op;


// Копирование дерева файлов
from = base_path + "Temp1\\*.*\n";
to   = base_path + "Temp\n"; \\ если нет - создаст, если есть - добавит недостающие

for (char *cp = from.c_str(); *cp; cp++)  if (*cp == '\n') *cp = 0x00;
for (char *cp = to.c_str();   *cp; cp++)  if (*cp == '\n') *cp = 0x00;

ZeroMemory(&op,sizeof(op));
op.hwnd                  = Handle;
op.wFunc                 = FO_COPY;
op.pFrom                 = from.c_str();
op.pTo                   = to.c_str();
op.fFlags                = FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR | FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS;
op.lpszProgressTitle     = "Копирую паку со всем содержимым";

SHFileOperation(&op);


ShowMessage("Можно полюбоваться на дело рук своих");


// Удадение файлов
// Удалять будем такое (обратить внимание на использование \n)
from = base_path + "Temp\\*.tmp\n" +
       base_path + "Temp\\*.bak\n" +
       base_path + "Temp\\*.$*\n"  +
       base_path + "Temp\\*.~*\n"  +
       base_path + "Temp\\Tmp\\*.*\n"  +
       "";

for (char *cp = from.c_str(); *cp; cp++)  if (*cp == '\n') *cp = 0x00;

ZeroMemory(&op,sizeof(op));
op.hwnd                  = Handle;
op.wFunc                 = FO_DELETE;
op.pFrom                 = from.c_str();
op.pTo                   = NULL;
// если без FOF_FILESONLY - из Temp\Tmp\ удалит все дерево из-за *.* в перечне
op.fFlags                = FOF_ALLOWUNDO /*| FOF_FILESONLY*/ | FOF_SIMPLEPROGRESS | FOF_NOCONFIRMATION;
//op.fAnyOperationsAborted =
//op.hNameMappings         =
op.lpszProgressTitle     = "Удаляю временные файлы";

SHFileOperation(&op);
}
Записан
Gedeon
Ы
Администратор
***

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 291


« Ответ #4 : 16 мая 2008, 12:21:12 »

Вот мои куски.
Это показывание ошибки, ими напичканы все функции, потому проще выложить чем оттуда убирать
Код
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;
}
//----------------------------------------------------------------------------
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: