Диски и файлы (C Builder). Диски и файлы (C++ Builder). Диски и файлы (C Builder)
Скачать 27.97 Kb.
|
Диски и файлы (C++ Builder) Получение метки диска Определение размера диска (VCL вариант) Определение свободного пространства на диске (VCL вариант) Создание ярлыка Удаление файла в корзину (VCL вариант) Удаление файла (Вариант 1) [+] Удаление файла (Вариант 2) Работа с файлами GIF и JPEG Преобразование *.ico файла в *.bmp Отображение свойств файла Копирование файлов Удаление директории Вpемя создания файла Поиск файлов в каталоге и его подкаталогах Как выбрать папку из диалога (Вариант 1) Как выбрать папку из диалога (Вариант 2) Как удалить папку и все файлы в ней Пример регистрации собственного расширения файла [+] Как узнать, есть ли указанный диск в системе [+] Как проверить наличие дискеты в дисководе Получение метки диска // Для получения метки диска напишите следующий код: 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 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 << ofOverwritePrompt << ofFileMustExist << ofHideReadOnly; 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 с сайта Borland X Portal Удаление директории // Для удаления директории напишите следующий код: 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 .. .. .. .. AnsiString way = "c:\\"; if(SelectDirectory("Укажите путь к папке","",way)) Label1->Caption = way; Как выбрать папку из диалога (Вариант 2) // Для того чтобы выбрать папку из диалога напишите следуюший код: #include .. .. .. .. 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 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+" ОШИБКА ЗАГРУЗКИ ФАЙЛА!!!"); } Автор: ant47 Пример регистрации собственного расширения файла // Напишите следующуй код: 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("Нет дискеты"); Наверх |