请问:
   在程序的运行中,当插入U盘时,程序可以检查到U盘,并可以判断U盘的大小,及U盘的剩余空间
 
  该怎样做

解决方案 »

  1.   

    需要有USB厂商的接口函数支持吧!
      

  2.   

    可以使用WIN32API GetDriveType,返回DRIVE_REMOVABLE,说明是可移动磁盘.该函数参数是PCHAR,需要注意它不能区分移动硬盘和u盘.但是我想由于u盘的盘符都出现在光驱之后,所以你可以用返回的和光驱的比一下,以区分是U盘还是移动硬盘.然后用GETDISKFREESPACE()函数算剩余空间.
      

  3.   

    TO BJSKYHORSE
      我用32M 的U盘是正确的。
     当我用128是读到的空间只有1/4 ,
     你能把代码贴出来吗?(能在WIN 98 或 WINXP 使用)
     剩余空间我是用MB 来表示的。
     谢谢。
     我可以再加一百分。
      

  4.   

    function GetDiskFreeSpaceEx(lpDirectoryName: PAnsiChar; 
                   var lpFreeBytesAvailableToCaller : Integer; 
                   var lpTotalNumberOfBytes: Integer; 
                   var lpTotalNumberOfFreeBytes: Integer) : bool; 
                   stdcall; 
                   external kernel32 
                   name 'GetDiskFreeSpaceExA'; 
     
                 procedure GetDiskSizeAvail(TheDrive : PChar; 
                                            var TotalBytes : double; 
                                            var TotalFree : double); 
                 var 
                   AvailToCall : integer; 
                   TheSize : integer; 
                   FreeAvail : integer; 
                 begin 
                   GetDiskFreeSpaceEx(TheDrive, 
                                      AvailToCall, 
                                      TheSize, 
                                      FreeAvail); 
                 {$IFOPT Q+} 
                  {$DEFINE TURNOVERFLOWON} 
                  {$Q-} 
                 {$ENDIF} 
                   if TheSize >= 0 then 
                     TotalBytes := TheSize else 
                   if TheSize = -1 then begin 
                     TotalBytes := $7FFFFFFF; 
                     TotalBytes := TotalBytes * 2; 
                     TotalBytes := TotalBytes + 1; 
                   end else 
                   begin 
                     TotalBytes := $7FFFFFFF; 
                     TotalBytes := TotalBytes + abs($7FFFFFFF - TheSize); 
                   end; 
     
                   if AvailToCall >= 0 then 
                     TotalFree := AvailToCall else 
                   if AvailToCall = -1 then begin 
                     TotalFree := $7FFFFFFF; 
                     TotalFree := TotalFree * 2; 
                     TotalFree := TotalFree + 1; 
                   end else 
                   begin 
                     TotalFree := $7FFFFFFF; 
                     TotalFree := TotalFree + abs($7FFFFFFF - AvailToCall); 
                   end; 
                 end; 
     
                 procedure TForm1.Button1Click(Sender: TObject); 
                 var 
                   TotalBytes : double; 
                   TotalFree : double; 
                 begin 
                   GetDiskSizeAvail('C:\', 
                                    TotalBytes, 
                                    TotalFree); 
                   ShowMessage(FloatToStr(TotalBytes)); 
                   ShowMessage(FloatToStr(TotalFree)); 
                 end; 
      

  5.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
    i:integer;
    DriveChar: Char;
    DriveString:String;
    DriveBits: set of 0..25;
       Receive,send :String;
       drivers :boolean;
       sec, bytes1, space1,space2:longword;
       byte1:double;
        SectorsPerCluster:  DWORD ;    // for both D3 and D4
        BytesPerSector   :  DWORD;
        FreeClusters     :  DWORD;
        TotalClusters    :  DWORD;
        BytesPerCluster  : Integer;
    begin
     Integer(DriveBits) := GetLogicalDrives;
        for i:=0 to 25 do
        begin
          if not (i in DriveBits) then Continue;
          DriveChar := Char(i + Ord('C'));
          case GetDriveType(PChar(DriveChar + ':\'))  of
          DRIVE_REMOVABLE:
          begin          drivers := GetDiskFreeSpace(PAnsichar(DriveChar + ':\'), SectorsPerCluster,
                                          BytesPerSector, FreeClusters, TotalClusters);
             if drivers = true then
             begin
             BytesPerCluster := SectorsPerCluster * BytesPerSector;
             send:= Floattostr(Roundto(BytesPerCluster * FreeClusters /1024/1024,-2))
             end ;
          showmessage((send));
          end;
          end;
          end;
    end;
      

  6.   

    TO ;keller
      以上是可以计算出剩余空间,
      但在当插入U盘时,程序可以检查到U盘怎样做?
    谢谢
      

  7.   

    我想应该要得到插入USB设备事件
    再检测设备类型是不是可移动盘
    再查移动盘盘符及容量(不过这些应该得系统分配完才好查)关注...
      

  8.   

    是不是可以用 kellerlee的方法,定时检测盘符呢?
      

  9.   

    TO:anbeel(番薯好吃,但不宜多吃)
      kellerlee的方法是可以检测,但程序的功能是当有U盘插入就立刻可以检测到。
    当U盘插入时是不是有个什么事件触发了?
      谢谢你的支持
      

  10.   

    处理消息WM_DEVICECHANG应该可以,具体的看一下MSDN吧.
      

  11.   

    加了个班,写了个小东西,不知满足你的要求否?不知如果满足你的要求后结帖否?请把mail给我,明早一早便可收到!!
      

  12.   

    TO;extcsdn(Studing VB now)
       发到[email protected]
       谢谢你
      

  13.   

    TO;extcsdn(Studing VB now)
    初步测试是没问题的。
    能把代码发给我吗?
    谢谢
      

  14.   

    最好发的: [email protected]
    谢谢
      

  15.   

    我已经发了啊![email protected]  那就再发一次吧!
      

  16.   

    TO:
     extcsdn(Studing VB now)
     谢谢,
    到  http://community.csdn.net/Expert/topic/3108/3108794.xml?temp=.3003351
    再多给你分
      

  17.   

    修正,请在Caption :='有移动存储设备插入!';和Caption :='有移动存储设备拔除!';后分别加上Caption :='有移动存储设备插入!';