GetDiskFreeSpaceEx(PChar(driver+':\'),userFreeBytes,totalBytes,@freeBytes);
我只能用这个来得到单个分区的大小,我想得到的是整个硬盘的大小,在哪看过一个 for循环来着,但当时没记下来,现在用到了也找不到了,高手给个帮助,,,,

解决方案 »

  1.   

    function GetDrives: string;
    var
      DiskType: Word;
      D: Char;
      Str: string;
      i: Integer;
    begin
      for i := 0 to 25 do 
      begin
        D := Chr(i + 65);
        Str := D + ':';
        DiskType := GetDriveType(PChar(Str));
        //得到本地磁盘和网络盘
        if (DiskType = DRIVE_FIXED) or (DiskType = DRIVE_REMOTE) then
        begin
          GetDiskFreeSpaceEx(PChar(D+'\'),userFreeBytes,totalBytes,@freeBytes);  
          //sum(userFreeBytes),sum(totalBytes),sum(freeBytes)
        end;
      end;
    end;
      

  2.   

    我照chenzhuo的帮助写的,可是返回值太大,是  45,740,221G,应该是没有正确指定盘符,还请大家帮忙一下,procedure TForm1.Button1Click(Sender: TObject);
     var
            d,dr:Char;
            DiskType:Word;
            Str:String;
            i:Integer;
          sum1,sum2,userFreeBytes,totalBytes,freeBytes:Int64;
     begin
       for i:= 0 to 25 do
       begin
             d:=Chr(i+65);
             Str:='d';
             DiskType:=GetDriveType(pChar(d+':\'));
             if(DiskType = DRIVE_FIXED) or (DiskType = DRIVE_REMOTE) then
             begin
             GetDiskFreeSpaceEx(pChar(d+':\'),userFreeBytes,totalBytes,@freeBytes);          sum1:= sum1+totalBytes;
              sum2:= sum2+freeBytes;
             end;
        end;
         Edit1.Text:=Formatfloat('###,##0',(((sum1)div 1000)div 1000)div 1000)+'G';
         Edit2.Text:=Formatfloat('###,##0',(((sum2)div 1000)div 1000)div 1000)+'G';
     end;
      

  3.   

    Sum1 跟 Sum2要初始化为 0procedure TForm1.Button1Click(Sender: TObject);
    var
            d,dr:Char;
            DiskType:Word;
            Str:String;
            i:Integer;
            sum1,sum2,userFreeBytes,totalBytes,freeBytes:Int64;
     begin
       sum1:=0;
       sum2:=0;
       
       for i:= 0 to 25 do
       begin
             d:=Chr(i+65);
             Str:='d';
             DiskType:=GetDriveType(pChar(d+':\'));
             if(DiskType = DRIVE_FIXED) or (DiskType = DRIVE_REMOTE) then
             begin
             GetDiskFreeSpaceEx(pChar(d+':\'),userFreeBytes,totalBytes,@freeBytes);          sum1:= sum1+totalBytes;
              sum2:= sum2+freeBytes;
             end;
        end;
         Edit1.Text:=Formatfloat('###,##0',(((sum1)div 1000)div 1000)div 1000)+'G';
         Edit2.Text:=Formatfloat('###,##0',(((sum2)div 1000)div 1000)div 1000)+'G';
    end;
      

  4.   

    if (DiskType = DRIVE_FIXED) or (DiskType = DRIVE_REMOTE) then
    对不起,我这里有一点是不对的地方!
    改为
     if (DiskType = DRIVE_FIXED) then
      

  5.   

    这是最后正确的答案,在机器上能正常调用运行,且返回值正确。在此感谢 chenzhuo 和Hs Wong的帮助,小弟的分太少,只能一人分一点。 在此整理出正确的答案,也许别人会用得上。
    Function  Get_Disk_Size:string;
      var
          d,dr:Char;
          DiskType:Word;
          Str,S1,S2:String;
          i:Integer;
          total,free,userFreeBytes,totalBytes,freeBytes:Int64;
      begin
           total:=0;  //   此处必须初始化,否则返回值巨大
           free:=0;     for i:= 0 to 25 do
       begin
             d:=Chr(i+65);
             Str:='d';
             DiskType:=GetDriveType(pChar(d+':\'));
             if(DiskType = DRIVE_FIXED)  then
             begin
             GetDiskFreeSpaceEx(pChar(d+':\'),userFreeBytes,totalBytes,@freeBytes);         total:= total+totalBytes;
             free:= free+freeBytes;
             end;
        end;
         S1:='硬盘总容量'+Formatfloat('###,##0',(((total)div 1000)div 1000)div 1000)+'G';
         S2:='硬盘可用空间'+Formatfloat('###,##0',(((free)div 1000)div 1000)div 1000)+'G';     Result:=S1+'        '+S2;     //中间的 '   '可以没有的,只是为了输出时加几个空格  end;