Справочник советов и примеров по C++Builder

       

Диски и файлы




  • Получение метки диска

    // Для получения метки диска напишите следующий код:
    char DiskLabel[MAX_PATH];

    char *DiskName = "c:\\"; // имя диска
    GetVolumeInformation(DiskName, DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0);

    // в DiskLabel находится метка диска

  • Определение размера диска (VCL вариант)

    // Для определения размера диска используйте функцию DiskSize, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер диска С в байтах.
    __int64 Size = DiskSize(3);

  • Определение свободного пространства на диске (VCL вариант)

    // Для определения свободного пространства на диске используйте функцию DiskFree, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер свободного пространства на диске С в байтах.

    __int64 FreeSpace = DiskFree(3);

  • Создание ярлыка

    // для использования функции необходимо подключить файл

    // shlobj.h

    // lpszPathObj - путь к объекту, для которого будет

    // создаваться ярлык

    // lpszPathLink - где будет создаватья ярлык

    // lpszDesc - описание ярлыка
    HRESULT CreateLink(LPCSTR lpszPathObj, LPSTR lpszPathLink, LPSTR lpszDesc)

    {

    HRESULT hres;

    IShellLink *psl;

    CoInitialize(NULL);

    hres = CoCreateInstance(CLSID_ShellLink, NULL,

    CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);

    if(SUCCEEDED(hres))

    {

    IPersistFile *ppf;

    psl->SetPath(lpszPathObj);

    psl->SetDescription(lpszDesc);

    hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);

    if(SUCCEEDED(hres))

    {

    wchar_t wsz[MAX_PATH];

    MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);

    hres = ppf->Save(wsz, true);

    ppf->Release();

    }

    psl->Release();

    CoUninitialize();

    }

    return hres;

    }

  • Удаление файла в корзину (VCL вариант)

    // разместите компонент TOpenDialog (OpenDialog1) и TButton (Button1) на форме (Form1). Для удаления файла в корзину напишите следующий код:
    void __fastcall TForm1::Button1Click(TObject *Sender)


    {

    if(OpenDialog1->Execute())

    {

    AnsiString DialogTitle = "Удаление в корзину";

    SHFILEOPSTRUCT FileOpStruct;

    ZeroMemory(&FileOpStruct, sizeof(SHFILEOPSTRUCT));

    FileOpStruct.pFrom = (OpenDialog1->FileName + '\0').c_str();

    FileOpStruct.wFunc = FO_DELETE;

    FileOpStruct.fFlags = FOF_ALLOWUNDO;

    FileOpStruct.lpszProgressTitle = DialogTitle.c_str();

    SHFileOperation(&FileOpStruct);

    }

    }



  • Удаление файла (Вариант 1)

    // Для удаления файла надо подключить к проекту Sysutils.hpp и напишите следующий код:
    void __fastcall TForm1::Button1Click(TObject *Sender)

    {

    AnsiString FileName="c:\\readme.txt";

    if (DeleteFile(FileName)) Label1->Caption="true";

    }



  • Удаление файла (Вариант 2)

    // Для удаления файла напишите следующий код:
    #include &ltstdio.h>

    String FileName="c:\\1.txt";

    remove(FileName.c_str());

  • Работа с файлами GIF и JPEG

    // Для того, чтобы стандартными средствами C++Builder'a работать с файлами GIF и JPEG, добавьте в начало программы следующий код:
    TPicture *Picture = new TPicture();

    Picture->RegisterFileFormat(__classid(TJPEGImage), "jpg", "jpg",

    __classid(TJPEGImage));

    delete Picture;

    TPicture *Picture = new TPicture();
    Picture->RegisterFileFormat(__classid(TGIFImage), "gif", "gif",

    __classid(TGIFImage));

    delete Picture;



  • Преобразование *.ico файла в *.bmp

    // На форме разместите TImage (Image1), TOpenDialog (OpenDialog1) и TButton (Button1). Напишите следующий обработчик события OnClick кнопки:
    void __fastcall TForm1::Button1Click(TObject *Sender)

    {

    AnsiString as;

    TIcon *pi = new TIcon();

    OpenDialog1->DefaultExt = ".ICO";

    OpenDialog1->Filter = "icons (*.ico)|*.ICO";

    OpenDialog1->Options

    if (OpenDialog1->Execute())

    {

    pi->LoadFromFile(OpenDialog1->FileName);

    as = ChangeFileExt(OpenDialog1->FileName,".BMP");

    Image1->Width = Icon->Width;

    Image1->Height = Icon->Height;



    Image1->Canvas->Draw(0, 0, Icon);

    Image1->Picture->SaveToFile(as);

    }

    delete pi;

    }



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

    // На форме разместите 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 первый параметр что копировать,

    // второй куда копировать

    FAQ с сайта



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

    // Для удаления директории напишите следующий код:
    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()

      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("Нет дискеты");


    Содержание раздела