none
在智能设备项目下,如何检测移动磁盘 RRS feed

  • 问题

  •  DriveInfo[] s = DriveInfo.GetDrives();
                foreach (DriveInfo drive in s)
                {
                    if (drive.DriveType == DriveType.Removable)
                    {
                        listBox1.Items.Add("U盘已插入,盘符为:" + drive.Name.ToString());
                        break;
                    }
                }

    在智能设备项目中,没有DriveInfo类,以上代码不能正常运行,请问我如何检测移动磁盘,并对其操作?谢谢

    2010年6月2日 13:44

答案

  • 你好,

    需要P/Invoke一下,具体参考网页:http://www.peterfoot.net/FreeSpaceOnStorageCards.aspx

     

    Code片段:

    public static DiskFreeSpace GetDiskFreeSpace(string directoryName)
    {
      DiskFreeSpace result = new DiskFreeSpace();
    
      if(!GetDiskFreeSpaceEx(directoryName, ref result.FreeBytesAvailable,
        ref result.TotalBytes, ref result.TotalFreeBytes))
      {
        throw new Win32Exception(Marshal.GetLastWin32Error(), "Error retrieving free disk space");
      }
      return result;
    }
    
    
    public struct DiskFreeSpace
    {
      public long FreeBytesAvailable;
      
      public long TotalBytes;
      
      public long TotalFreeBytes;
    }
    
    [DllImport("coredll")]
    private static extern bool GetDiskFreeSpaceEx(string directoryName,
      ref long freeBytesAvailable,
      ref long totalBytes,
      ref long totalFreeBytes);

    施炯
    • 已标记为答案 adamas 2010年6月6日 0:43
    2010年6月3日 8:14

全部回复

  • 你好,

    不知道你所说的智能设备是什么? 在Windows mobile/WinCE中,我们可以调用GetDiskFreeSpaceEx()来获取Storage Card的信息,如CF卡等等。

     


    施炯
    2010年6月3日 2:43
  • 智能设备室MAT-700HT型号的小电脑,系统是WinCE5.0,请问具体如何调用GetDiskFreeSpaceEx()呢

    2010年6月3日 4:01
  • 你好,

    可以参考这个帖子的方法:http://topic.csdn.net/t/20060323/17/4635453.html

    BOOL   DisplayStorgeSize(LPCTSTR     lpszPath)
    {      
      ASSERT(lpszPath!=     NULL);    
    if   (lpszPath==NULL)      
    return     FALSE;  

        LPCTSTR     lpstrPath=lpszPath;
        ULARGE_INTEGER       pFreeBAvailableToCaller;  
        ULARGE_INTEGER       pTotalNuOfBytes;  
        CString   strForMatName=_T( " ");
       
        if(::GetDiskFreeSpaceEx(  
              lpstrPath,    
              &pFreeBAvailableToCaller,  
              &pTotalNuOfBytes,  
              NULL))    
          {   strForMatName.Format(_T( "%d "),pTotalNuOfBytes.LowPart/1048576);  
              strForMatName+=_T( "   M ");
              MessageBox(NULL,strForMatName,_T( "Info "),MB_OKCANCEL);
      return   TRUE;
    }
          else   return   FALSE;
    }


    施炯
    2010年6月3日 4:23
  • 我现在在用C#,不知道能不能用C#调用呢?

    2010年6月3日 6:44
  • 你好,

    需要P/Invoke一下,具体参考网页:http://www.peterfoot.net/FreeSpaceOnStorageCards.aspx

     

    Code片段:

    public static DiskFreeSpace GetDiskFreeSpace(string directoryName)
    {
      DiskFreeSpace result = new DiskFreeSpace();
    
      if(!GetDiskFreeSpaceEx(directoryName, ref result.FreeBytesAvailable,
        ref result.TotalBytes, ref result.TotalFreeBytes))
      {
        throw new Win32Exception(Marshal.GetLastWin32Error(), "Error retrieving free disk space");
      }
      return result;
    }
    
    
    public struct DiskFreeSpace
    {
      public long FreeBytesAvailable;
      
      public long TotalBytes;
      
      public long TotalFreeBytes;
    }
    
    [DllImport("coredll")]
    private static extern bool GetDiskFreeSpaceEx(string directoryName,
      ref long freeBytesAvailable,
      ref long totalBytes,
      ref long totalFreeBytes);

    施炯
    • 已标记为答案 adamas 2010年6月6日 0:43
    2010年6月3日 8:14