使用ManagementObject读取磁盘上的文件大小



我遇到以下情况,在ManagementObject变量中使用.First((时出错,但我不知道如何更正。有人能帮我吗?(在项目中使用System.Management参考(

public static long GetFileSizeOnDisk(string file)
{
FileInfo info = new FileInfo(file);
uint clusterSize;
var searcher = new ManagementObjectSearcher("select BlockSize,NumberOfBlocks from Win32_Volume WHERE DriveLetter = '" + info.Directory.Root.FullName.TrimEnd('\') + "'")

clusterSize = (uint)((ManagementObject)searcher.Get().First())["BlockSize"];
uint hosize;
uint losize = GetCompressedFileSizeW(file, out hosize);
long size = (long) hosize << 32 | losize;

return ((size + clusterSize - 1) / clusterSize) * clusterSize;
}

还有

[DllImport("kernel32.dll")]
static extern uint GetCompressedFileSizeW(
[In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
[Out, MarshalAs(UnmanagedType.U4)] out uint lpFileSizeHigh);

错误为:

Error   CS1061  'ManagementObjectCollection' does not contain a definition for 'First' and no accessible extension method 'First' accepting a first argument of type 'ManagementObjectCollection' could be found (are you missing a using directive or an assembly reference?)

您需要将其转换为Linq理解的东西:

public class Program
{
[DllImport("kernel32.dll")]
static extern uint GetCompressedFileSizeW(
[In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
[Out, MarshalAs(UnmanagedType.U4)] out uint lpFileSizeHigh);
static void Main()
{
var x = GetFileSizeOnDisk("d:\x.jpg");
Console.WriteLine(x);
}

public static ulong GetFileSizeOnDisk(string file)
{
FileInfo info = new FileInfo(file);
ulong clusterSize = 4096;
var searcher = new ManagementObjectSearcher("select BlockSize,NumberOfBlocks from Win32_Volume WHERE DriveLetter = '" + info.Directory.Root.FullName.TrimEnd('\') + "'");
var mo = (searcher.Get() as ManagementObjectCollection).OfType<ManagementObject>().FirstOrDefault();
if(mo != null)
clusterSize = (ulong)mo["BlockSize"];
uint hosize;
uint losize = GetCompressedFileSizeW(file, out hosize);
ulong size = hosize << 32 | losize;
var res = ((size + clusterSize - 1) / clusterSize) * clusterSize;
return res;
}
}

最新更新