2016-08-29 3 views
3

Ich möchte nach einer Datei auf allen Festplatten im System suchen. Ich weiß schon, wie auf einer einzigen Platte von dieser Frage suchen: How to Search a File through all the SubDirectories in DelphiWie finde ich die Laufwerksbuchstaben für alle Festplatten eines Systems?

Ich benutze es als

function TMyForm.FileSearch(const dirName: string); 

... 

FileSearch('C:'); 

Was ich weiß nicht, wie zu tun ist, es zu verwenden, um Dateien auf allen verfügbaren Laufwerksbuchstaben zu finden, C, D, E usw. Wie kann ich eine Liste der verfügbaren Laufwerksbuchstaben finden?

+3

Was haben Sie versucht, abgesehen davon, diesen Code zu finden? – rgoliveira

+3

Sie müssen zuerst eine Liste aller Festplatten abrufen und dann durch diese Liste iterieren. Sicherlich bist du nicht die erste Person, die das macht ... –

+1

Außerdem scheint dein Code das 'Windows'-Verzeichnis zu durchsuchen. Hast du wirklich ein 'Windows'-Verzeichnis auf jeder Platte? Möchten Sie wirklich danach suchen? –

Antwort

12

Sie können nur eine Liste der verfügbaren Laufwerke abrufen und diese durchgehen, indem Sie Ihre Funktion aufrufen.

In den letzten Versionen von Delphi können Sie IOUtils.TDirectory.GetLogicalDrives verwenden, um eine Liste aller Laufwerksbuchstaben einfach abzurufen.

uses 
    System.Types, System.IOUtils; 

var 
    Drives: TStringDynArray; 
    Drive: string 
begin 
    Drives := TDirectory.GetLogicalDrives; 
    for s in Drives do 
    FileSearch(s);   
end; 

Bei älteren Versionen von Delphi, die IOUtils nicht enthalten, können Sie die WinAPI Funktion GetLogicalDriveStrings verwenden. Es ist wesentlich komplizierter zu verwenden, aber hier ist ein Code, der es für Sie umschließt. (Sie benötigen Windows, SysUtils und Typen in Ihrer uses-Klausel.)

function GetLogicalDrives: TStringDynArray; 
var 
    Buff: String; 
    BuffLen: Integer; 
    ptr: PChar; 
    Ret: Integer; 
    nDrives: Integer; 
begin 
    BuffLen := 20; // Allow for A:\#0B:\#0C:\#0D:\#0#0 initially 
    SetLength(Buff, BuffLen); 
    Ret := GetLogicalDriveStrings(BuffLen, PChar(Buff)); 

    if Ret > BuffLen then 
    begin 
    // Not enough memory allocated. Result has buffer size needed. 
    // Allocate more space and ask again for list. 
    BuffLen := Ret; 
    SetLength(Buff, BuffLen); 
    Ret := GetLogicalDriveStrings(BuffLen, PChar(Buff)); 
    end; 

    // If we've failed at this point, there's nothing we can do. Calling code 
    // should call GetLastError() to find out why it failed. 
    if Ret = 0 then 
    Exit; 

    SetLength(Result, 26); // There can't be more than 26 drives (A..Z). We'll adjust later. 
    nDrives := -1; 
    ptr := PChar(Buff); 
    while StrLen(ptr) > 0 do 
    begin 
    Inc(nDrives); 
    Result[nDrives] := String(ptr); 
    ptr := StrEnd(ptr); 
    Inc(ptr); 
    end; 
    SetLength(Result, nDrives + 1); 
end; 
+0

Beachten Sie jedoch, dass möglicherweise Volumes vorhanden sind, denen keine Laufwerkbuchstaben zugewiesen sind. (In den meisten Fällen ist es in Ordnung, sie zu ignorieren.) –

+0

@Harry: True, aber die Frage fragt speziell nach den Laufwerksbuchstaben für alle Festplatten. –

Verwandte Themen