Du burde kunne finde det hele via WMI. Her er et eksempel på clusterstørrelsen:
using System.Management
ObjectQuery query = new ObjectQuery("SELECT BlockSize, DriveLetter FROM Win32_Volume"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection collection = searcher.Get(); foreach (ManagementObject obj in collection) { Console.WriteLine("BlockSize of {0} is: {1}", obj["DriveLetter"], obj["BlockSize"]); }
Det skulle nok være muligt at finde noget brugbart information om harddisken under Win32_DiskPartition, Win32_LogicalDisk, Win32_DiskDrive, Win32_Volume og lignende.
Hvis du holder dig til Win32_Volume klassen, så kan du regne det hele ud ved lidt simpel matematik:
BlockSize = Cluster størrelse Capacity = Total plads på disk FreeSpace = Ledig plads på disk Alle tre angivelser er i bytes.
Capacity / BlockSize = Total antal clusters FreeSpace / BlockSize = Antal ledige clusters
Det er i øvrigt også cluster størrelsen der spiller ind, hvis du vælger egenskaber for en fil på din harddisk, og ser to forskellige størrelsesangivelser i "størrelse" og "diskforbrug". Den første er filens reelle størrelse, og den anden er hvor meget plads den egentligt optager på din disk. Hvis du dividerer begge tal med cluster størrelsen, kan du se at "størrelse" ofte ikke går op i clusterstørrelsen, mens "diskforbrug" gør.
Ah jeg kan se fremgangs måden :D Super tak! Dog får jeg en exception når jeg prøver at køre ovenstående. Når den når ned til foreach smider den en "Invalid class" exception? Kan du afmystificere det? :P
Ja jeg bruer resharper, så den husker det meste for mig :)... Men jeg har smidt det hele ind i en try-catch, det er det eneste der er til forskel fra dit til mit?
Daemon tools er underordnet - jeg har det også her, uden problemer. Har prøvet at target både .Net 3.5 og 2.0 - det gør heller ingen forskel. Alt virker her. Kører selv Vista SP1 x64, men det burde være underordnet...
Heheh, du har i hvert fald metoderne til at finde de informationer du skal bruge, så håber jeg du får løst dit problem på anden vis. Det er jeg vist ikke meget behjælpelig med, hvis selv Microsoft giver op :D
using System; using System.IO; using System.Runtime.InteropServices; using System.Text;
namespace E {
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct NTFS_VOLUME_DATA_BUFFER { public long VolumeSerialNumber; public long NumberSectors; public long TotalClusters; public long FreeClusters; public long TotalReserved; public uint BytesPerSector; public uint BytesPerCluster; public uint BytesPerFileRecordSegment; public uint ClustersPerFileRecordSegment; public long MftValidDataLength; public long MftStartLcn; public long Mft2StartLcn; public long MftZoneStart; public long MftZoneEnd; } public class Program { public const int FSCTL_GET_NTFS_VOLUME_DATA = 589924; [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr CreateFile( string fileName, [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess, [MarshalAs(UnmanagedType.U4)] FileShare fileShare, IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, int flags, IntPtr template); [DllImport("kernel32.dll", SetLastError=true)] static extern bool CloseHandle(IntPtr hHandle); [DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)] public static extern bool DeviceIoControl( IntPtr hDevice, uint dwIoControlCode, IntPtr lpInBuffer, int nInBufferSize, out NTFS_VOLUME_DATA_BUFFER lpOutBuffer, int nOutBufferSize, out int pBytesReturned, IntPtr lpOverlapped); public static void Main(string[] args) { NTFS_VOLUME_DATA_BUFFER data = new NTFS_VOLUME_DATA_BUFFER(); int datalen; IntPtr h = CreateFile(@"\\.\C:", FileAccess.Read, FileShare.Write, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero); if(!DeviceIoControl(h, FSCTL_GET_NTFS_VOLUME_DATA, IntPtr.Zero, 0, out data, Marshal.SizeOf(data), out datalen, IntPtr.Zero)) { throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); } CloseHandle(h); Console.WriteLine(data.BytesPerCluster); Console.ReadKey(); } } }
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.