2011-04-12 9 views
5

Duplicar posibles:
Get drive information (free space, etc.) for drives on Windows and populate a memo boxDelphi - Enumerar el disco (s) y otras unidades en PC con Windows

Soy bastante nuevo en la programación (especialmente Delphi), y ha sido imposible para encontrar ejemplos de cómo enumerar todas las unidades en una PC.

Realmente me preocupan los discos duros y las unidades de CD-ROM, pero no he podido encontrar nada utilizable.

¿Alguien me puede indicar una buena muestra de trabajo?

+0

Lo siento mucho, busqué antes de publicar, pero no vi la otra publicación. ¿Debo eliminar mi pregunta? – DelphiDelver

+0

Eso está bien. It * is * no es fácil buscar duplicados. Creo que puedes dejar tu pregunta aquí (además, no creo que incluso * puedas * eliminarla desde que se publicó una respuesta). Además, de esta manera será más fácil encontrar este tema en SO en el futuro, porque entonces hay dos preguntas con una redacción ligeramente diferente. –

+0

No debe preocuparse por eliminarlo, y en una nota muy egoísta, estoy contento, ya que aceptó la respuesta, mientras que el póster original no. Así es la vida. – Reallyethical

Respuesta

14

La manera más simple es en realidad usar GetDiskFreeSpaceEx del archivo sysutils.pas.

Hay 2 partes en este ejemplo. la 1ra es la parte importante usando GetDiskFreeSpaceEX.

function DriveSpace(DriveLetter : String; var FreeSpace, UsedSpace, TotalSpace : int64) : Boolean; 
begin 
    Result := SysUtils.GetDiskFreeSpaceEx(Pchar(DriveLetter), UsedSpace, TotalSpace, @FreeSpace); 

    if UsedSpace > 0 then 
    UsedSpace := TotalSpace - FreeSpace; 

    if not Result then 
    begin 
    UsedSpace := 0; 
    TotalSpace := 0; 
    FreeSpace := 0; 
    end; 
end; 

Si va a solicitar unidades que ya conoce la letra de la unidad como C: eso es todo lo que necesita.

uso sería algo así como:

var 
    FS, 
    US, 
    TS : Int64 
begin 
    DriveSpace('C:', FS, US, TS); 
    //Do something with the 3 variables. 
end; 

Dicho esto, si usted quiere encontrar las unidades, así que podría utilizar algo como esto:

procedure ListDrivesOfType(DriveType : Integer; var Drives : TStringList); 
var 
    DriveMap, 
    dMask : DWORD; 
    dRoot : String; 
    I  : Integer; 
begin 
    dRoot  := 'A:\'; //' // work around highlighting 
    DriveMap := GetLogicalDrives; 
    dMask  := 1; 

    for I := 0 to 32 do 
    begin 
    if (dMask and DriveMap) <> 0 then 
     if GetDriveType(PChar(dRoot)) = DriveType then 
     begin 
     Drives.Add(dRoot[1] + ':'); 
     end; 

    dMask := dMask shl 1; 
    Inc(dRoot[1]); 
    end; 
end; 

Nota entero DriveType, debe ser uno de los siguientes:

DRIVE_UNKNOWN  = 0; 
DRIVE_NO_ROOT_DIR = 1; 
DRIVE_REMOVABLE = 2; 
DRIVE_FIXED  = 3; 
DRIVE_REMOTE  = 4; 
DRIVE_CDROM  = 5; 
DRIVE_RAMDISK  = 6; 

(He tomado estos directamente de windows.pas)


Ahora, finalmente, a responder a su pregunta (y esto es muy áspero) lo siguiente sería añadir información en una nota (llamado memo1) para todos FIXED HARD DRIVES:

Procedure TAform.SomeNameICantThinkOfNow; 
const 
    BytesPerMB = 1048576; 
var 
    MyDrives : TStringlist; 
    I : Integer; 
    FreeSpace, 
    UsedSpace, 
    TotalSpace : int64; 
begin 
    MyDrives := TStringlist.Create; 
    ListDrivesOfType(DRIVE_FIXED, MyDrives); 

    Memo1.Lines.Clear; 

    for I := 0 to MyDrives.Count - 1 do 
    begin 
    FreeSpace := 0; 
    UsedSpace := 0; 
    TotalSpace := 0; 

    if DriveSpace(MyDrives.Strings[I], FreeSpace, UsedSpace, TotalSpace) then 
    begin 
     FreeSpace := FreeSpace div BytesPerMB; 
     UsedSpace := UsedSpace div BytesPerMB; 
     TotalSpace := TotalSpace div BytesPerMB; 

     Memo1.Lines.Add('Drive: ' + MyDrives.Strings[I] + ' = Free Space :' + IntToStr(FreeSpace) + 
         ' Used Space: ' + IntToStr(UsedSpace) + ' Total Space: ' + IntToStr(TotalSpace)); 
    end; 
    end; 
end; 

Yo he dicho que lo haría ser desagradable! Acabo de ejecutar esto en el IDE y funciona, lo he hecho como MB, pero realmente debería convertirlo a Double y elegir su formateo si lo hace como MB para ser más preciso ya que el ejemplo que he creado arriba, por supuesto, simplemente redondeará .

Espero que esto sea de poca ayuda.

+0

Gracias, lo veré ahora, le daré una votación positiva, pero parece que soy muy nuevo en el sitio. Lo siento – DelphiDelver

2

Ver GLibWMI Library; Con él, puede acceder a información sobre las unidades del sistema.

+0

+1 por hacerme descubrir esta lib – FileVoyager

Cuestiones relacionadas