在.NET中查找总磁盘空间和可用磁盘空间

时间:2009-11-25 21:13:01

标签: .net directory diskspace

我正在尝试找到一种方法来确定.NET应用程序中任意文件夹中的总磁盘空间和可用磁盘空间。通过文件夹中的“总磁盘空间”和“可用磁盘空间”,我指的是如果对其执行“dir”命令,则该文件夹将报告的总磁盘空间和可用磁盘空间,即,总磁盘空间和可用磁盘空间。包含该文件夹的逻辑驱动器,考虑正在进行请求的用户帐户。

我正在使用C#。该方法应该对作为UNC路径给出的本地和远程文件夹起作用(而不是通过映射的驱动器号访问)。例如,它应该适用于:

  • C:\温度
  • \\ Silfen \资源\ TEMP2

我从DirectoryInfo对象开始,但这似乎没有关联的磁盘空间信息。 DriveInfo类可以,但不能用于远程文件夹。

编辑。与您们进行一些交流后,我正在考虑将远程文件夹映射为本地驱动器,使用DriveInfo获取数据,然后再取消映射。这种方法的问题是我的应用程序需要每天几次收集120多个文件夹的数据。我不确定这是可行的。

有什么想法吗?感谢。

9 个答案:

答案 0 :(得分:12)

使用System.IO.DriveInfo类的this link from MSDN怎么样?

答案 1 :(得分:11)

你可以使用 GetDiskFreeSpaceEx from kernel32.dll与UNC路径和驱动器一起使用。您需要做的就是包含一个DllImport(参见示例链接)。

答案 2 :(得分:3)

这个可能不是你想要的,但我正在努力提供帮助,并且它有一点点安全的奖励,可以擦除驱动器的可用空间。

public static string DriveSizeAvailable(string path)
{
    long count = 0;
    byte toWrite = 1;
    try
    {
        using (StreamWriter writer = new StreamWriter(path))
        {
            while (true)
            {
                writer.Write(toWrite);
                count++;
            }
        }
    }
    catch (IOException)
    {                
    }

    return string.Format("There used to be {0} bytes available on drive {1}.", count, path);
}

public static string DriveSizeTotal(string path)
{
    DeleteAllFiles(path);
    int sizeAvailable = GetAvailableSize(path);
    return string.Format("Drive {0} will hold a total of {1} bytes.", path, sizeAvailable);
}

答案 3 :(得分:2)

不是真正的C#示例,但可能会给你一个提示 - 一个VB.NET函数返回指定路径上的驱动器(以字节为单位)的空闲和总空间量。与System.IO.DriveInfo不同,也适用于UNC路径。

VB.NET:

<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetDiskFreeSpaceEx(lpDirectoryName As String, ByRef lpFreeBytesAvailable As ULong, ByRef lpTotalNumberOfBytes As ULong, ByRef lpTotalNumberOfFreeBytes As ULong) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

Public Shared Function GetDriveSpace(folderName As String, ByRef freespace As ULong, ByRef totalspace As ULong) As Boolean
    If Not String.IsNullOrEmpty(folderName) Then
        If Not folderName.EndsWith("\") Then
            folderName += "\"
        End If

        Dim free As ULong = 0, total As ULong = 0, dummy2 As ULong = 0
        If GetDiskFreeSpaceEx(folderName, free, total, dummy2) Then
            freespace = free
            totalspace = total
            Return True
        End If
    End If
End Function

答案 4 :(得分:1)

System.IO.DriveInfo工作正常。我连接到两个单独的Netware服务器,其中映射了多个驱动器。

这是本地C:驱动器:

Drive C:\
  File type: Fixed
  Volume label: Drive C
  File system: NTFS
  Available space to current user:   158558248960 bytes
  Total available space:             158558248960 bytes
  Total size of drive:               249884004352 bytes 

以下是其中一个网络驱动器的输出:

Drive F:\
  File type: Network
  Volume label: SYS
  File system: NWFS
  Available space to current user:     1840656384 bytes
  Total available space:               1840656384 bytes
  Total size of drive:                 4124475392 bytes 

我直接从DriveInfo上的MSDN文档中使用了以下代码:

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        DriveInfo[] allDrives = DriveInfo.GetDrives();

        foreach (DriveInfo d in allDrives)
        {
            Console.WriteLine("Drive {0}", d.Name);
            Console.WriteLine("  File type: {0}", d.DriveType);
            if (d.IsReady == true)
            {
                Console.WriteLine("  Volume label: {0}", d.VolumeLabel);
                Console.WriteLine("  File system: {0}", d.DriveFormat);
                Console.WriteLine(
                    "  Available space to current user:{0, 15} bytes", 
                    d.AvailableFreeSpace);

                Console.WriteLine(
                    "  Total available space:          {0, 15} bytes",
                    d.TotalFreeSpace);

                Console.WriteLine(
                    "  Total size of drive:            {0, 15} bytes ",
                    d.TotalSize);
            }
        }
    }
}

答案 5 :(得分:1)

这是我多年来使用的另一种可能性。下面的示例是VBScript,但它应该适用于任何支持COM的语言。请注意,GetDrive()也适用于UNC股票。

Dim Tripped
Dim Level

Tripped = False
Level   = 0

Sub Read(Entry, Source, SearchText, Minimum, Maximum)

    Dim fso
    Dim disk

    Set fso  = CreateObject("Scripting.FileSystemObject")

    Set disk = fso.GetDrive(Source)

    Level = (disk.AvailableSpace / (1024 * 1024 * 1024))

    If (CDbl(Level) < CDbl(Minimum)) or (CDbl(Level) > CDbl(Maximum)) Then
        Tripped = True
    Else
        Tripped = False
    End If

End Sub

答案 6 :(得分:1)

Maksim Sestic给出了最佳答案,因为它适用于本地和UNC路径。为了更好的错误处理,我更改了他的代码并包含了一个示例。对我来说就像一个魅力。

你需要把

Imports System.Runtime.InteropServices

进入您的代码,以允许识别DllImport。

以下是修改后的代码:

<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetDiskFreeSpaceEx(lpDirectoryName As String, ByRef lpFreeBytesAvailable As ULong, ByRef lpTotalNumberOfBytes As ULong, ByRef lpTotalNumberOfFreeBytes As ULong) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

Public Shared Function GetDriveSpace(folderName As String, ByRef freespace As ULong, ByRef totalspace As ULong) As Boolean

Dim free As ULong = 0
Dim total As ULong = 0
Dim dummy2 As ULong = 0

Try

    If Not String.IsNullOrEmpty(folderName) Then

         If Not folderName.EndsWith("\") Then
             folderName += "\"
         End If

         If GetDiskFreeSpaceEx(folderName, free, total, dummy2) Then
             freespace = free
             totalspace = total
             Return True
         End If

     End If

Catch
End Try

    Return False

End Function

这样称呼:

dim totalspace as ulong = 0
dim freespace as ulong = 0
if GetDriveSpace("\\anycomputer\anyshare", freespace, totalspace) then
    'do what you need to do with freespace and totalspace
else
    'some error
end if

foldername也可以是drive:\path\path\...

等本地目录

它仍然在VB.NET中,但转换成C#应该不是问题。

答案 7 :(得分:0)

我很确定这是不可能的。在Windows资源管理器中,如果我尝试获取UNC目录的文件夹属性,它就没有任何可用空间。已用/可用空间是驱动器的特征,而不是文件夹,UNC共享仅被视为文件夹。

你必须:
  - 映射驱动器
  - 在远程计算机上运行某些内容以检查磁盘空间。

你也可能遇到像分布式文件系统这样的问题,其中UNC / Mapped共享没有绑定到任何特定的驱动器,所以你必须实际总结几个驱动器。

用户配额怎么样?驱动器可能未满,但您用于写入该文件夹的帐户可能已达到其限制。

答案 8 :(得分:0)

不是C#,只提供可用的空间,但是。 。

dir \\server\share | find /i "bytes free"

让你成为一部分。我正在寻找或者相同的解决方案,但似乎没有一个好的解决方案 - 特别是在试图避免映射驱动器时。