我正在尝试找到一种方法来确定.NET应用程序中任意文件夹中的总磁盘空间和可用磁盘空间。通过文件夹中的“总磁盘空间”和“可用磁盘空间”,我指的是如果对其执行“dir”命令,则该文件夹将报告的总磁盘空间和可用磁盘空间,即,总磁盘空间和可用磁盘空间。包含该文件夹的逻辑驱动器,考虑正在进行请求的用户帐户。
我正在使用C#。该方法应该对作为UNC路径给出的本地和远程文件夹起作用(而不是通过映射的驱动器号访问)。例如,它应该适用于:
我从DirectoryInfo对象开始,但这似乎没有关联的磁盘空间信息。 DriveInfo类可以,但不能用于远程文件夹。
编辑。与您们进行一些交流后,我正在考虑将远程文件夹映射为本地驱动器,使用DriveInfo获取数据,然后再取消映射。这种方法的问题是我的应用程序需要每天几次收集120多个文件夹的数据。我不确定这是可行的。
有什么想法吗?感谢。
答案 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"
让你成为一部分。我正在寻找或者相同的解决方案,但似乎没有一个好的解决方案 - 特别是在试图避免映射驱动器时。