How do you read hard disk sectors in C++ with gcc/linux? Is there a standard library that I can use or must something be downloaded? In Windows I can use CreateFile(...) to access raw disk sectors, but I do not know how to do in in Linux.
I am using GCC on Ubuntu LTS 10.4. Thank you for your help.
To successfully mount and access NTFS drives on Linux, you will need to install a driver to ensure no incompatibility issues arise. The go-to driver when working with NTFS drives is NTFS-3G. It's cross-compatible between Debian/Ubuntu derivatives, Arch Linux-based systems as well as RHEL/CentOS/Fedora systems.
The hard disk is just another file (not a "regular file" but a "device file", but still, a file). Open it the normal way...
int fdes = open("/dev/sda1", O_RDONLY);
if (fdes < 0)
err(1, "/dev/sda1");
... do more ...
You will get permission errors unless you have the right permissions. Note that "/dev/sda1"
is just an example, it is the first partition on disk sda
, the exact path will depend on your system. You can list mount points with the mount
command, and you can access entire disks (instead of just partitions) using /dev/sda
, /dev/sdb
, etc.
You could also open it as a C++ fstream
or C FILE
, but I do not recommend this. You will have a better time finding example code and getting help on forums if you use open
instead.
As others have correctly pointed out, disk access on Linux (and other Unix-like operating systems) is via a device special file. On my Ubuntu laptop, my hard drive is named "/dev/sda".
Since you specifically ask how to do it in C++ (not merely how to do it in Linux), here is how to read one sector using 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)));
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With