Как получить физический размер файла на диске в C#

Размер файла

Чтобы получить логический размер файла в C# можно воспользоваться хорошо известным свойством Length класса FileInfo. Но это свойство возвращает логический а не физический размер на диске. Когда вам нужен именно физический размер, то можно воспользоваться способом представленным в этой заметке.

Логический размер файла и его размер на диске можно посмотреть с помощью Windows Explorer:

Логический и физический размер файла на диске  Как получить физический размер файла на диске в C#

Логический размер получаем так:

var filelength = new FileInfo(filepath).Length;

Для получения размера на диске получаем используем следующий статический метод:

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);

Обратите внимание на то, что этот способ использует P/Invoke.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>