Borland C++ FAQ
Страница 5. Диски и файлы. Часть 2




  • Отображение свойств файла

    // На форме разместите TOpenDialog (OpenDialog1) и TButton
    // (Button1) напишите следующий обработчик события OnClick кнопки:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    if(OpenDialog1->Execute())
    {
    SHELLEXECUTEINFO SEI;
    ZeroMemory(&SEI, sizeof(SHELLEXECUTEINFO));
    SEI.cbSize= sizeof(SHELLEXECUTEINFO);
    SEI.lpVerb = "properties";
    SEI.lpFile= OpenDialog1->FileName.c_str();
    SEI.nShow = SW_SHOW;
    SEI.fMask= SEE_MASK_INVOKEIDLIST;
    ShellExecuteEx(&SEI);
    }
    }

  • Копирование файлов

    // Для того чтобы скопировать файлы напишите следующий код:
    int MoveFiles( AnsiString slSourceDir, AnsiString slTargetDir, bool toCopy = true )
    {
    SHFILEOPSTRUCT sh;
    sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_FILESONLY;
    sh.wFunc = toCopy ? FO_COPY : FO_MOVE;
    sh.pFrom = slSourceDir.c_str();
    sh.pTo = slTargetDir.c_str();
    sh.hNameMappings = NULL;
    sh.lpszProgressTitle = NULL;
    return SHFileOperation ( &sh );
    }

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //copy all from program files
    if(!MoveFiles("c:\\program files\\*.*", "c:\\temp"))
    ShowMessage("Ok");
    else ShowMessage("No");
    }
    // В функции MoveFiles первый параметр что копировать,
    // второй куда копировать


  • Удаление директории

    // Для удаления директории напишите следующий код:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    SHFILEOPSTRUCT sh;
    sh.hwnd=Form1->Handle;
    sh.wFunc = FO_DELETE;
    sh.pFrom = "c:\\test\0"; //удаляемая директория
    sh.pTo = NULL;
    sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
    sh.hNameMappings = 0;
    sh.lpszProgressTitle = NULL;
    SHFileOperation(&sh);
    }

  • Вpемя создания файла

    // На форме должны быть Lаbel1 и Button1, затем напишите следующий код:
    TDateTime FileTimeToDateTime(FILETIME *lpftime)
    {
    FILETIME localfiletime;
    SYSTEMTIME systime;
    FileTimeToLocalFileTime(lpftime,&localfiletime);
    FileTimeToSystemTime(&localfiletime,&systime);
    return(TDateTime(systime.wYear, systime.wMonth, systime.wDay)+
    TDateTime(systime.wHour, systime.wMinute,
    systime.wSecond, systime.wMilliseconds));
    }
    //----------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    FILETIME ftCreationTime,ftLastAccessTime,ftLastWriteTime;
    HANDLE hFile=(HANDLE)FileOpen("c:\\autoexec.bat",fmOpenRead);
    GetFileTime(hFile,&ftCreationTime,&ftLastAccessTime,&ftLastWriteTime);
    AnsiString FileInfo="FileName: c:\\autoexec.bat";
    FileInfo+="\nCreation Time:"+
    FormatDateTime("c",FileTimeToDateTime(&ftCreationTime));
    FileInfo+="\nLast Access Time:"+
    FormatDateTime("c",FileTimeToDateTime(&ftLastAccessTime));
    FileInfo+="\nLast Write Time:"+
    FormatDateTime("c",FileTimeToDateTime(&ftLastWriteTime));
    Label1->Caption=FileInfo;
    FileClose((int) hFile);
    }

  • Поиск файлов в каталоге и его подкаталогах

    // Для поиска файлов в каталоге и его подкаталогах напишите следующий код:
    void ListFiles(AnsiString path, TStrings* List)
    {
    // Эта процедура выводит список файлов и вызывает
    // саму себя для всех каталогов
    TSearchRec sr;
    if (FindFirst(path+"*.*", faAnyFile, sr) == 0)
    {
     do
     {
     if (sr.Attr & faDirectory)
      {
      if (sr.Name!=".")
      if (sr.Name!="..")
       {
       ListFiles(path+sr.Name+"\\",List);// Рекурсивный вызов
       }
      }
      else
       {
       AnsiString Ext=ExtractFileExt(sr.Name).UpperCase();
       if (Ext==".CPP")
       List->Add(path+sr.Name);
       }
     }
     while (FindNext(sr) == 0);
     FindClose(sr);
    }
    Application->ProcessMessages();
    }

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    ListFiles("c:\\",Memo1->Lines);
    }

  • Как выбрать папку из диалога (Вариант 1)

    // Для того чтобы выбрать папку из диалога напишите следуюший код:
    #include <FileCtrl.hpp>
    .. .. .. ..
    AnsiString way = "c:\\";
    if(SelectDirectory("Укажите путь к папке","",way))
      Label1->Caption = way;

  • Как выбрать папку из диалога (Вариант 2)

    // Для того чтобы выбрать папку из диалога напишите следуюший код:
    #include <FileCtrl.hpp>
    .. .. .. ..
    AnsiString way = "c:\\";
    if(SelectDirectory(way,
    TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, 0))
      Label1->Caption = way;

  • Как удалить папку и все файлы в ней

    // Для того чтобы удалить папку и все файлы в ней напишите следующую функцию:
    bool DeleteDir(AnsiString DirName)
    {
    TSearchRec sr;
    if (DirName.Length())
     {
     if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
     do
      {
      if (!(sr.Name=="." || sr.Name==".."))// это удалять не надо
       if (((sr.Attr & faDirectory) == faDirectory ) ||
       (sr.Attr == faDirectory))// найдена папка
        {
        FileSetAttr(DirName+"\\"+sr.Name, faDirectory );// сброс всяких read-only
        DeleteDir(DirName+"\\"+sr.Name);//рекурсивно удаляем содержимое
        RemoveDir(DirName + "\\"+sr.Name);// удаляем теперь уже пустую папку
        }
        else// иначе найден файл
        {
        FileSetAttr(DirName+"\\"+sr.Name, 0);// сброс всяких read-only
        DeleteFile(DirName+"\\"+sr.Name);// удаляем файл
        }
      }
     while (!FindNext(sr));// ищем опять, пока не найдем все
     FindClose(sr);
     }
    RemoveDir(DirName);
    return true;
    }

  • Пример регистрации собственного расширения файла

    // Напишите следующую функцию:
    #include <Registry.hpp>

    TRegistry *Reg;
    Reg=NULL;
    try
    {
      Reg=new TRegistry;
      Reg->RootKey=HKEY_CLASSES_ROOT;
      Reg->OpenKey("\\.ant",true);
      Reg->WriteString("","MyProgram");
      Reg->CloseKey();
      Reg->OpenKey("\\MyProgram", true);
      Reg->WriteString("","My document");
      Reg->CloseKey();
      Reg->OpenKey("\\MyProgram\\Shell\\Open\\Command",true);
      Reg->WriteString("",ParamStr(0)+" \"%1\"");
      Reg->CloseKey();
      Reg->OpenKey("\\MyProgram\\DefaultIcon",true);
      Reg->WriteString("",ParamStr(0)+", 1");
      Reg->CloseKey();
    }
    __finally
    {
    if (Reg!=NULL)delete Reg;
    }
    // Весь текст генерирует расширение *.ant

    // А этот код загружает файл с расширением *.ant в Image1.
    if (ParamCount>0)
    {
    asFileName=ParamStr(1);
    if (FileExists(asFileName)) Image1->Picture->LoadFromFile(asFileName);
      else ShowMessage(asFileName+" ОШИБКА ЗАГРУЗКИ ФАЙЛА!!!");
    }

     

  • Пример регистрации собственного расширения файла

    // Напишите следующуй код:
    if(GetDriveType("F:\\") == DRIVE_NO_ROOT_DIR)
    MessageBox(NULL, "Указанного диска в системе нет!", "Внимание!", MB_OK | MB_ICONEXCLAMATION);
    else
    MessageBox(NULL, "Указанный диск есть в системе!", "Внимание!", MB_OK | MB_ICONINFORMATION);

     

  • Как проверить наличие дискеты в дисководе

    // Напишите следующуй код:
    bool IsDriveReady(char drive)
    {
    bool out;
    WORD OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
    char path[4];path[0] = drive;path[1] = ':';path[2] = '\\';path[3] = 0;
    out = (SetCurrentDirectory(path) != 0);
    SetErrorMode(OldErrorMode);
    return out;
    }

    if (IsDriveReady('a'))
    ShowMessage("Дискета в дисководе");
    else ShowMessage("Нет дискеты");

  •  

     

     
    « Предыдущая статья