在Linux上用c++读取硬盘扇区
Reading Hard Disk Sectors in C++ on Linux
如何使用gcc/linux在c++中读取硬盘扇区?是否有我可以使用的标准库,或者必须下载一些东西?在Windows中,我可以使用CreateFile(…)来访问裸磁盘扇区,但我不知道如何在Linux中这样做。
我在Ubuntu LTS 10.4上使用GCC。谢谢你的帮助。
硬盘只是另一个文件(不是"常规文件"而是"设备文件",但仍然是一个文件)。按正常方式打开…
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
,您将有更好的时间找到示例代码并在论坛上获得帮助。
正如其他人正确指出的那样,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)));
}
您可以使用dd命令将磁盘扇区转储到文件中,并读取生成的文件
相关文章:
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- "constinit"和"constexpr"之间的真正区别是什么?
- ((int) a) 和 (int(a)) 之间的区别是什么?
- 如何完全删除窗口的非工作区?
- 如何使用ATA命令读取磁盘的特定扇区
- 获得有关硬盘扇区中原始数据更改的通知-文件更改通知
- 如何以编程方式使用 MBR 和 USB 闪存扇区
- 写入文件的原始磁盘扇区
- 找到一个位于扇区内部的点
- 如何使用 SDL 2 和 C++ 绘制椭圆的填充扇区
- CFile将如何处理坏扇区
- 原始读取带有 fstream 的引导扇区
- C++将数据写入随机HDD扇区
- 使用哪个小部件将硬盘扇区显示为十六进制
- 我可以通过扇区级数据来判断硬盘上安装的操作系统吗?
- 在Linux上用c++读取硬盘扇区
- ReadFile FILE_FLAG_NO_BUFFERING如何读取两个扇区之间的数据
- 写入文件失败,错误码为87,每个扇区磁盘4096字节
- DeviceIoControl返回意外的物理扇区大小
- 如何在CD或DVD上获得扇区的准确位置和角度(数据位置测量)