¿Cómo puedo determinar el espacio / tamaño de mi unidad mediante programación? Tanto en Linux y en Windows
Pregunta
Esto es: ¿Cómo puedo comprobar el tamaño de la unidad que no tiene el formato ... No tienen en cuenta las unidades con formato ... solo disco no formateado.
Solución
En Linux, si desea que el tamaño de toda la unidad, lea /sys/block/sda/size
.
Para encontrar el tamaño de una partición, leer /sys/block/sda/sda1/size
.
Reemplazar sda
, sda1
con los nombres de los dispositivos / particiones.
O, si se puede abrir el archivo de dispositivo sin procesar, se puede utilizar el BLKGETSIZE
ioctl
.
Otros consejos
para las ventanas .. puede utilizar Dispositivo ().
#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);
}
mediante programación en 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));
}
Este es básicamente el código de http://www.linuxproblem.org/art_20.html, adaptado para usar BLKGETSIZE64
, con varios avisos fijos.