使用.Net检查文件系统容量的最佳方法是什么?

4

在.Net中,确保路径能够存储文件的最佳方法是什么?我需要确保在下载文件之前有足够的空间,因为源不允许文件被第二次下载。我已经查看了System.IO.DriveInfo,但这对于UNC路径不起作用。


要不尝试一下使用API调用,而不是WMI呢? - Matthew Whited
@Matthew:为什么你更喜欢API而不是WMI?使用WMI可以有一个非常简短的解决方案,并且通过使用WMI,你可以保持完全管理(使用System.Management命名空间)。 - Noldorin
我认为一个简单的PInvoke可能比在WMI中操作更好。但我猜WMI也可以工作。 - Matthew Whited
@Matthew:我已经更新了我的帖子,现在展示了两种方法(WMI和Win32 API)。虽然显然前者更简单,但任何一种方法都应该适用于你。 - Noldorin
3个回答

5

以下是从此页面摘取的一个简短的功能,它显示了如何使用WMI获取任何驱动器(本地或网络/UNC)的可用空间。

private static ulong GetFreeDiskSpaceInBytes(string drive)
{
    ManagementObject disk =
        new ManagementObject("win32_logicaldisk.deviceid=\"" + drive + ":\"");
    disk.Get();
    return (ulong)disk["FreeSpace"];
}

如果您需要Win32 API解决方案,可以使用GetDiskFreeSpaceEx函数,如此MSDN帮助页面所建议的。它似乎也支持本地和网络驱动器名称。
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" _
    Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, _
    lpFreeBytesAvailableToCaller As Currency, _
    lpTotalNumberOfBytes As Currency, _
    lpTotalNumberOfFreeBytes As Currency) As Long

Private Sub Form_Click()
    Dim Status As Long
    Dim TotalBytes As Currency
    Dim FreeBytes As Currency
    Dim BytesAvailableToCaller As Currency

    Status = GetDiskFreeSpaceEx(Text1.Text, BytesAvailableToCaller, _
      TotalBytes, FreeBytes)
    If Status <> 0 Then
        MsgBox Format(TotalBytes * 10000, "#,##0"), , "Total Bytes"
        MsgBox Format(FreeBytes * 10000, "#,##0"), , "Free Bytes"
        MsgBox Format(BytesAvailableToCaller * 10000, "#,##0"), , _
          "Bytes Available To Caller"
    End If
End Sub

如果你在将它转换为C#时遇到问题,请告诉我。

我会推荐使用WMI解决方案,因为它是完全托管的(除了行数较少),但两者都可以完成任务。


0

我相信您可以使用WMI获取所需的答案,这通常是一个很好的起点。


0

唯一确定磁盘是否能存储文件的方法是在磁盘上实际创建该大小的文件。

即使磁盘信息显示有足够的空间,由于碎片整理,你很少能使用100%的可用磁盘空间。


我在考虑确保存在两到三倍所需的空间,以便拥有额外的覆盖范围。但是感谢你的提醒。 - Matthew Whited

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接