Dies verwendet GetCompressedFileSize, wie von ho1 vorgeschlagen, sowie GetDiskFreeSpace, wie von PaulStack vorgeschlagen, verwendet jedoch P / Invoke. Ich habe es nur für komprimierte Dateien getestet und ich vermute, dass es für fragmentierte Dateien nicht funktioniert.
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);
FileInfo.Directory.Root
sieht nicht so aus, als könnte es irgendeine Art von Dateisystem-Links verarbeiten. Es funktioniert also nur mit klassischen lokalen Laufwerksbuchstaben ohne Symlinks / Hardlinks / Junction Points oder was auch immer NTFS zu bieten hat.System.ComponentModel
undSystem.Runtime.InteropServices
.Der obige Code nicht richtig funktioniert Windows Server 2008 oder 2008 R2 oder Windows 7 und Windows Vista - basierte Systeme wie Clustergröße immer Null (GetDiskFreeSpaceW und GetDiskFreeSpace return -1 sogar mit UAC deaktiviert.) Hier ist der modifizierte Code , das funktioniert.
C #
VB.NET
quelle
.First()
da es sich um einenIEnumerable
und keinen handeltIEnumerable<T>
, wenn Sie den Code zum ersten Mal verwenden möchten.Cast<object>()
Laut MSDN-Sozialforen:
Siehe So ermitteln Sie die Größe einer Datei in C # auf der Festplatte .
Beachten Sie jedoch, dass dies in NTFS, in dem die Komprimierung aktiviert ist, nicht funktioniert .
quelle
GetCompressedFileSize
anstattfilelength
komprimierte und / oder spärliche Dateien zu berücksichtigen.Ich denke, es wird so sein:
Ich mache noch einige Tests dafür, um eine Bestätigung zu erhalten.
quelle