2009-12-25 8 views

답변

3

전체 드라이브의 크기를 원한다면 Linux에서 /sys/block/sda/size을 읽으십시오.

파티션의 크기를 확인하려면 /sys/block/sda/sda1/size을 읽으십시오.

sda, sda1을 장치/파티션 이름으로 바꿉니다.

또는 원시 장치 파일을 열 수있는 경우 BLKGETSIZEioctl을 사용할 수 있습니다.

+1

또는'/ proc/partitions'를 스캔하십시오. :) – ephemient

2

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

는 : 다양한 경고가 고정으로

이 기본적으로 http://www.linuxproblem.org/art_20.html에서 코드
#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)); 
} 

, BLKGETSIZE64를 사용하도록.

관련 문제