![]() |
DriveTools - nützliche Laufwerks Routinen
Für ein Projekt brauchte ich ein paar Routinen bezüglich Laufwerke. Rausgekommen ist die Unit DriveTools.
Routinen: GetLogicalDrives - Listet alle logischen Laufwerke auf
Delphi-Quellcode:
Drives ist ein dynamisches String-Array, muss bereit gestellt werden
procedure GetLogicalDrives(var Drives: TStringArray; ReadyOnly: Boolean = True;
WithLabels: Boolean = True); ReadyOnly, es werden nur Laufwerke berücksichtig, die bereit sind WithLables, es werden zusätzlich die Laufwerksbezeichnungen mit angegeben FindAllFiles - Sucht Dateien
Delphi-Quellcode:
RootFolder, Ordner der dursucht werden soll
procedure FindAllFiles(RootFolder: string; Mask: string; Recurse: Boolean =
True); Mask, Dateimaske der zu findenden Dateien Recurse, rekursive Suche durch Unterverzeichnisse Wichtig: zu FindAllFiles gehört: InitFindAllFiles - initialisiert die globalen Variablen FoundFiles, cntFoundFiles diese Prozedur muss immer vor FindAllFiles aufgerufen werden. FindAllFiles arbeitet mit den globalen Variablen FoundFiles, einem dynamischen String-Array und cntFoundFiles welches die gefundenen Datein zählt und für die Größe des dynamischen String-Arrays verantwortlich ist. GetVolumeLabel - ermittelt die Datenträgerbezeichnung
Delphi-Quellcode:
Drive ist das Laufwerk, dessen Datenträgerbezeichnug ermittelt werden soll.
function GetVolumeLabel(const Drive: string): string;
Delphi-Quellcode:
Eiune aktuelle Version immer unter:
{************************************************************}
{ } { DriveTools } { Version: 2.0 } { } { Copyright (c) 2004 Michael Puff } { [url]www.luckie-online.de[/url] } { } {************************************************************} {************************************************************* History: - 2004-12-18 - 1.0 - LoadLogicalDrives - FindAllFiles - GetVolumeLabel - 2004-12-18 - 2.0 - Rewrote FindAllFiles (no SysUtils, no Classes) and added InitFindAllFiles - Rewrote GetLogicalDrives (no SysUtils, no Classes) *************************************************************} unit DriveTools; interface uses Windows; type TStringArray = array of string; var FoundFiles : TStringArray; cntFoundFiles: Integer = 0; procedure GetLogicalDrives(var Drives: TStringArray; ReadyOnly: Boolean = True; WithLabels: Boolean = True); procedure InitFindAllFiles; procedure FindAllFiles(RootFolder: string; Mask: string; Recurse: Boolean = True); function GetVolumeLabel(const Drive: string): string; implementation //////////////////////////////////////////////////////////////////////////////// // // GetVolumeLabel // function GetVolumeLabel(const Drive: string): string; var RootDrive : string; Buffer : array[0..MAX_PATH + 1] of Char; FileSysFlags : DWORD; MaxCompLength: DWORD; begin result := ''; FillChar(Buffer, sizeof(Buffer), #0); if length(Drive) = 1 then RootDrive := Drive + ':\' else RootDrive := Drive; if GetVolumeInformation(PChar(RootDrive), Buffer, sizeof(Buffer), nil, MaxCompLength, FileSysFlags, nil, 0) then begin result := string(Buffer); end; end; //////////////////////////////////////////////////////////////////////////////// // // GetLogicalDrives // procedure GetLogicalDrives(var Drives: TStringArray; ReadyOnly: Boolean = True; WithLabels: Boolean = True); function DriveIsReady(const Drive: string): Boolean; var wfd : TWin32FindData; hFindData : THandle; begin SetErrorMode(SEM_FAILCRITICALERRORS); hFindData := FindFirstFile(Pointer(Drive + '*.*'), wfd); if hFindData <> INVALID_HANDLE_VALUE then begin Result := True; end else begin Result := False; end; FindClose(hFindData); SetErrorMode(0); end; var FoundDrives : PChar; CurrentDrive : PChar; len : DWord; cntDrives : Integer; begin cntDrives := 0; SetLength(Drives, 26); GetMem(FoundDrives, 255); len := GetLogicalDriveStrings(255, FoundDrives); if len > 0 then begin try CurrentDrive := FoundDrives; while CurrentDrive[0] <> #0 do begin if ReadyOnly then begin if DriveIsReady(string(CurrentDrive)) then begin if WithLabels then Drives[cntDrives] := CurrentDrive + ' [' + GetVolumeLabel(CurrentDrive) + ']' else Drives[cntDrives] := CurrentDrive; Inc(cntDrives); end; end else begin if WithLabels then Drives[cntDrives] := CurrentDrive + ' [' + GetVolumeLabel(CurrentDrive) + ']' else Drives[cntDrives] := CurrentDrive; Inc(cntDrives); end; CurrentDrive := PChar(@CurrentDrive[lstrlen(CurrentDrive) + 1]); end; finally FreeMem(FoundDrives, len); end; SetLength(Drives, cntDrives); end; end; //////////////////////////////////////////////////////////////////////////////// // // InitFindAllFiles // Resets global variables FoundFiles and cntFoundFiles // Must always be called before FindAllFiles!!! procedure InitFindAllFiles; begin SetLength(FoundFiles, 0); cntFoundFiles := 0; end; //////////////////////////////////////////////////////////////////////////////// // // FindAllFiles // procedure FindAllFiles(RootFolder: string; Mask: string; Recurse: Boolean = True); var hFindFile : THandle; wfd : TWin32FindData; Filename : string; begin if RootFolder[length(RootFolder)] <> '\' then RootFolder := RootFolder + '\'; ZeroMemory(@wfd, sizeof(wfd)); wfd.dwFileAttributes := FILE_ATTRIBUTE_NORMAL; if Recurse then begin hFindFile := FindFirstFile(pointer(RootFolder + '*.*'), wfd); if hFindFile <> 0 then try repeat if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then if (string(wfd.cFileName) <> '.') and (string(wfd.cFileName) <> '..') then begin FindAllFiles(RootFolder + wfd.cFileName, Mask, Recurse); end; until FindNextFile(hFindFile, wfd) = False; finally Windows.FindClose(hFindFile); end; end; hFindFile := FindFirstFile(pointer(RootFolder + Mask), wfd); if hFindFile <> INVALID_HANDLE_VALUE then try repeat if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> FILE_ATTRIBUTE_DIRECTORY then begin Filename := RootFolder + string(wfd.cFileName); if length(FoundFiles) = cntFoundFiles then SetLength(FoundFiles, length(FoundFiles) + 100); FoundFiles[cntFoundFiles] := Filename; Inc(cntFoundFiles); end; until FindNextFile(hFindFile, wfd) = False; finally Windows.FindClose(hFindFile); setlength(FoundFiles, cntFoundFiles); end; end; end. ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz