2011-09-02 326 views
7

如何使用gcc/linux读取C++中的硬盘扇区?是否有我可以使用的标准库或必须下载的东西?在Windows中,我可以使用CreateFile(...)访问原始磁盘扇区,但我不知道如何在Linux中执行操作。在Linux上使用C++读取硬盘扇区

我在Ubuntu LTS 10.4上使用GCC。感谢您的帮助。

回答

11

硬盘只是另一个文件(不是“常规文件”,而是“设备文件”,但仍然是一个文件)。以正常方式打开它...

int fdes = open("/dev/sda1", O_RDONLY); 
if (fdes < 0) 
    err(1, "/dev/sda1"); 
... do more ... 

除非您拥有正确的权限,否则您将获得权限错误。请注意,"/dev/sda1"只是一个示例,它是磁盘sda上的第一个分区,确切路径将取决于您的系统。你可以列出安装点与mount命令,你可以使用/dev/sda/dev/sdb,访问整个磁盘(而不仅仅是分区)等

你也可以打开它作为一个C++ fstream或C FILE,但我不推荐这个。如果您使用open代替,您将有更好的时间查找示例代码并获得论坛帮助。

+1

'的/ dev/sda1'将是一个分区......对原始驱动器访问你可能想用'的/ dev/sda' –

+0

+1“只是一个文件”,而不是搞乱' dd'。要小心权限,你可能需要成为磁盘组或root的成员(不是一个好主意)才能这样做。 – Flexo

+0

这将是非常有帮助的。 –

1

你可以转储磁盘扇区用dd命令文件和读取文件生成

7

正如其他人正确地指出,在Linux(和其他类Unix操作系统)的磁盘访问是通过特殊的设备文件。在我的Ubuntu笔记本电脑上,我的硬盘被命名为“/ dev/sda”。

由于您特别要求如何使用C++(而不只是如何在Linux中执行此操作),下面是如何使用std::ifstream读取一个扇区。

#include <fstream> 
#include <cerrno> 
#include <stdexcept> 
#include <cstring> 
#include <vector> 

int main() { 
    // Which disk? 
    char diskName[] = "/dev/sda"; 
    std::string diskError = std::string() + diskName + ": "; 

    // Open device file 
    std::ifstream disk(diskName, std::ios_base::binary); 

    if(!disk) 
    throw(std::runtime_error(diskError + std::strerror(errno))); 

    // Seek to 54321'th sector 
    disk.seekg(512 * 54321); 
    if(!disk) 
    throw(std::runtime_error(diskError + std::strerror(errno))); 

    // Read in one sector 
    std::vector<char> buffer(512); 
    disk.read(&buffer[0], 512); 
    if(!disk) 
    throw(std::runtime_error(diskError + std::strerror(errno))); 
} 
+0

谢谢你,这是非常有用的代码。 –