Как я могу определить пространство / размер моего диска программно? Как в LInux, так и в Windows

То есть: как я могу проверить размер диска, который не отформатирован … Не считайте форматированные диски … просто неформатированным диском.

Под Linux, если вы хотите размер всего диска, читайте /sys/block/sda/size .

Чтобы узнать размер раздела, прочтите /sys/block/sda/sda1/size .

Замените sda , sda1 на имена ваших устройств / разделов.

Или, если вы можете открыть файл необработанного устройства, вы можете использовать BLKGETSIZE ioctl .

для окон .. вы можете использовать DeviceIoControl ().

 #include  #include  #include  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); } 

Программно в Linux:

 #include  #include  #include  #include  #include  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)); } 

Это в основном код от http://www.linuxproblem.org/art_20.html , адаптированный для использования BLKGETSIZE64 , с различными предупреждениями.