那是: 如何检查未格式化的驱动器大小... 不要考虑格式化的驱动器......只是未格式化的驱动器。
答案 0 :(得分:3)
在Linux下,如果您想要整个驱动器的大小,请阅读/sys/block/sda/size
。
要查找分区的大小,请阅读/sys/block/sda/sda1/size
。
将sda
,sda1
替换为您设备/分区的名称。
或者,如果您可以打开原始设备文件,则可以使用BLKGETSIZE
ioctl
。
答案 1 :(得分:2)
for windows ..你可以使用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);
}
答案 2 :(得分:0)
在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));
}
这基本上是来自http://www.linuxproblem.org/art_20.html的代码,适用于使用BLKGETSIZE64
,并修复了各种警告。