首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取磁盘上文件的大小

获取磁盘上文件的大小
EN

Stack Overflow用户
提问于 2010-09-20 18:37:03
回答 4查看 92.2K关注 0票数 86
代码语言:javascript
复制
var length = new System.IO.FileInfo(path).Length;

这会给出文件的逻辑大小,而不是磁盘上的大小。

我希望在C#中获得磁盘上文件的大小(最好不要使用互操作),因为Windows Explorer会报告这个大小。

它应该给出正确的大小,包括:

  • A压缩文件
  • 稀疏文件
  • 碎片文件
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-20 19:45:36

这使用了ho1建议的GetCompressedFileSize,以及PaulStack建议的GetDiskFreeSpace,但是,它使用了P/Invoke。我只对压缩文件进行了测试,我怀疑它对碎片文件不起作用。

代码语言:javascript
复制
public static long GetFileSizeOnDisk(string file)
{
    FileInfo info = new FileInfo(file);
    uint dummy, sectorsPerCluster, bytesPerSector;
    int result = GetDiskFreeSpaceW(info.Directory.Root.FullName, out sectorsPerCluster, out bytesPerSector, out dummy, out dummy);
    if (result == 0) throw new Win32Exception();
    uint clusterSize = sectorsPerCluster * bytesPerSector;
    uint hosize;
    uint losize = GetCompressedFileSizeW(file, out hosize);
    long size;
    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);

[DllImport("kernel32.dll", SetLastError = true, PreserveSig = true)]
static extern int GetDiskFreeSpaceW([In, MarshalAs(UnmanagedType.LPWStr)] string lpRootPathName,
   out uint lpSectorsPerCluster, out uint lpBytesPerSector, out uint lpNumberOfFreeClusters,
   out uint lpTotalNumberOfClusters);
票数 50
EN

Stack Overflow用户

发布于 2011-07-29 12:58:43

上面的代码在基于Windows Server 2008或2008 R2或Windows7和Windows的系统上无法正常工作,因为集群大小始终为零(即使禁用了UAC,GetDiskFreeSpaceW和GetDiskFreeSpace也会返回。)以下是修改后的代码。

C#

代码语言:javascript
复制
public static long GetFileSizeOnDisk(string file)
{
    FileInfo info = new FileInfo(file);
    uint clusterSize;
    using(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;
    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);

VB.NET

代码语言:javascript
复制
  Private Function GetFileSizeOnDisk(file As String) As Decimal
        Dim info As New FileInfo(file)
        Dim blockSize As UInt64 = 0
        Dim clusterSize As UInteger
        Dim searcher As New ManagementObjectSearcher( _
          "select BlockSize,NumberOfBlocks from Win32_Volume WHERE DriveLetter = '" + _
          info.Directory.Root.FullName.TrimEnd("\") + _
          "'")

        For Each vi As ManagementObject In searcher.[Get]()
            blockSize = vi("BlockSize")
            Exit For
        Next
        searcher.Dispose()
        clusterSize = blockSize
        Dim hosize As UInteger
        Dim losize As UInteger = GetCompressedFileSizeW(file, hosize)
        Dim size As Long
        size = CLng(hosize) << 32 Or losize
        Dim bytes As Decimal = ((size + clusterSize - 1) / clusterSize) * clusterSize

        Return CDec(bytes) / 1024
    End Function

    <DllImport("kernel32.dll")> _
    Private Shared Function GetCompressedFileSizeW( _
        <[In](), MarshalAs(UnmanagedType.LPWStr)> lpFileName As String, _
        <Out(), MarshalAs(UnmanagedType.U4)> lpFileSizeHigh As UInteger) _
        As UInteger
    End Function
票数 17
EN

Stack Overflow用户

发布于 2010-09-20 18:47:21

根据MSDN社交论坛:

磁盘上的大小应为存储文件的群集大小的总和:

long sizeondisk = clustersize * ((filelength + clustersize - 1) / clustersize);

您需要深入P/Invoke来查找集群大小;GetDiskFreeSpace()将返回该值。

参见。

但请注意,这在打开压缩的NTFS中不起作用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3750590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档