【问题标题】:How can I determine the space/size of my drive programatically? Both in LInux and on Windows如何以编程方式确定驱动器的空间/大小?在 Linux 和 Windows 中
【发布时间】:2009-12-25 03:44:25
【问题描述】:

那是: 如何检查未格式化的驱动器大小... 不要考虑格式化的驱动器...只是未格式化的驱动器。

【问题讨论】:

    标签: c windows linux diskspace


    【解决方案1】:

    在 Linux 下,如果您想要整个驱动器的大小,请阅读 /sys/block/sda/size

    要查找分区的大小,请阅读/sys/block/sda/sda1/size

    sdasda1 替换为您的设备/分区名称。

    或者,如果您可以打开原始设备文件,则可以使用BLKGETSIZE ioctl

    【讨论】:

    • 或扫描/proc/partitions :)
    • 它是块的大小。我们如何获得块大小? 4K 阻塞的 HDD 大小是否仍以 512 字节为单位报告?
    【解决方案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);
    }
    

    【讨论】:

      【解决方案3】:

      在 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,修复了各种警告。

      $ gcc -o getsize getsize.c
      $ sudo ./getsize /dev/sda
      Number of bytes: 53687091200, this makes 50.000 GB
      

      【讨论】:

        猜你喜欢
        • 2010-12-19
        • 2011-04-16
        • 1970-01-01
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        相关资源
        最近更新 更多