2009-12-25 39 views

回答

3

在Linux下,如果您想要整個驅動器的大小,請閱讀/sys/block/sda/size

要查找分區的大小,請閱讀/sys/block/sda/sda1/size

用您的設備/分區的名稱替換sda,sda1

或者,如果您可以打開原始設備文件,則可以使用BLKGETSIZEioctl

+1

或掃描'/ proc/partitions' :) – ephemient 2009-12-26 17:58:50

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); 
} 
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,與各種警告固定。

相關問題