Come è possibile determinare lo spazio / dimensioni del mio disco programatically? Sia in Linux e su Windows
Domanda
Cioè: Come posso controllare la dimensione dell'unità non formattato ... Non considerare le unità formattate ... solo disco non formattato.
Soluzione
Sotto Linux, se si desidera che la dimensione del l'intero disco, leggere /sys/block/sda/size
.
Per trovare la dimensione di una partizione, leggere /sys/block/sda/sda1/size
.
Sostituire sda
, sda1
con i nomi dei vostri dispositivi / partizioni.
In alternativa, se è possibile aprire il file di dispositivo grezzo, è possibile utilizzare il BLKGETSIZE
ioctl
.
Altri suggerimenti
per le finestre .. è possibile utilizzare DeviceIoControl ().
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
HANDLE hDevice; // handle to the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results
hDevice = CreateFile(TEXT("\\\\.\\PhysicalDrive0"), // drive
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // do not copy file attributes
if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
return (FALSE);
}
bResult = DeviceIoControl(hDevice, // device to be queried
IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
NULL, 0, // no input buffer
pdg, sizeof(*pdg), // output buffer
&junk, // # bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O
CloseHandle(hDevice);
return (bResult);
}
int main(int argc, char *argv[])
{
DISK_GEOMETRY pdg; // disk drive geometry structure
BOOL bResult; // generic results flag
ULONGLONG DiskSize; // size of the drive, in bytes
bResult = GetDriveGeometry (&pdg);
if (bResult)
{
printf("Cylinders = %I64d\n", pdg.Cylinders);
printf("Tracks/cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
printf("Sectors/track = %ld\n", (ULONG) pdg.SectorsPerTrack);
printf("Bytes/sector = %ld\n", (ULONG) pdg.BytesPerSector);
DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
printf("Disk size = %I64d (Bytes) = %I64d (Gb)\n", DiskSize,
DiskSize / (1024 * 1024 * 1024));
}
else
{
printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
}
return ((int)bResult);
}
di programmazione in Linux:
#include <fcntl.h>
#include <linux/fs.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd;
unsigned long long numblocks=0;
fd = open(argv[1], O_RDONLY);
ioctl(fd, BLKGETSIZE64, &numblocks);
close(fd);
printf("Number of bytes: %llu, this makes %.3f GB\n",
numblocks,
(double)numblocks / (1024 * 1024 * 1024));
}
Questo è fondamentalmente il codice http://www.linuxproblem.org/art_20.html, atto ad utilizzare BLKGETSIZE64
, con varie avvertenze apposte.