在C#中获取磁盘的簇大小 - GetDiskFreeSpace' GetDiskFreeSpace'

时间:2014-12-01 01:14:44

标签: c# pinvoke

我试图在C#中获取磁盘的簇大小。我发现的所有内容都说使用“GetFreeDiskSpace”,但我无法让它工作。看起来好像我错过了使用或其他东西。

当我谷歌The name 'GetDiskFreeSpace' does not exist in the current context它会带来除了这个特定错误之外的所有内容。如果我执行完全短语搜索,Google会说没有找到任何内容,然后会显示不准确的短语搜索结果。

我正在尝试确定GetFreeDiskSpace的来源,而不是如何修复The name 'UnknownKeyWord' does not exist in the current context消息。

我需要获取磁盘的实际簇大小,而不是我可以确定磁盘上的大小,但所以我可以填充一个ComboBox。

注意:我使用的是VS 2010。

以下是我的用法:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Diagnostics;
using System.Globalization;
using System.Management;
using System.Runtime.InteropServices;

我也有以下内容:

// Pinvoke for API function
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]

代码(未完成......我需要解析GetFreeDiskSpace中的信息)我必须得到的簇大小是:

private void btnRefreshDrives_Click(object sender, EventArgs e)
{
    DriveInfo[] allDrives = DriveInfo.GetDrives();
    foreach (DriveInfo d in allDrives)
    {
        if (d.IsReady)
        {                    
            strDriveInfo = d.Name + " " + d.VolumeLabel;
            strCurrentFS = d.DriveFormat;
            strDriveLetter = d.Name;
            // The GetFreeDiskSpace has the red squiggly line under it in VS.
            ClusterSize = SectorsPerCluster * BytesPerSector;
            GetDiskFreeSpace(strDriveLetter, out SectorsPerCluster, out BytesPerSector, out NumberOfFreeClusters, out TotalNumberOfClusters);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

如果要使用GetFreeDiskSpace,则需要导入函数定义:

[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern bool GetDiskFreeSpace(string lpRootPathName, 
   out uint lpSectorsPerCluster, 
   out uint lpBytesPerSector, 
   out uint lpNumberOfFreeClusters, 
   out uint lpTotalNumberOfClusters);

答案 1 :(得分:0)

有两个问题:

  1. 您实际上没有声明(至少是复制到代码中的内容)GetDiskFreeSpace方法。它应该是:

    [DllImport("kernel32",SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int GetDiskFreeSpace(string lpRootPathName, out int lpSectorsPerCluster, out int lpBytesPerSector, out int lpNumberOfFreeClusters, out int lpTotalNumberOfClusters);
    
  2. 在检索值之前,您正在计算ClusterSize。应该是:

    GetDiskFreeSpace(strDriveLetter, out SectorsPerCluster, out BytesPerSector, out NumberOfFreeClusters, out TotalNumberOfClusters);
    var ClusterSize = SectorsPerCluster * BytesPerSector;
    
  3. 我已经确认通过这两项更改(以及相应的错误检查),这可以正常工作。