এটি হ'ল প্রস্তাবিত হিসাবে গেটকম্প্রেসড ফাইলসাইজ এবং গেটডিস্কফ্রিস্পেস ব্যবহার করে, যেমন পলস্ট্যাক পরামর্শ দিয়েছে, তবে এটি পি / ইনভোক ব্যবহার করে। আমি এটি কেবল সংক্ষেপিত ফাইলগুলির জন্য পরীক্ষা করেছি এবং আমার সন্দেহ হয় যে এটি খণ্ডিত ফাইলগুলির জন্য কাজ করে না।
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);