ファイルシステムを利用せず、ドライブに対して直接アクセスしたい場合、Visual C++では、CreateFile()関数を使用するとあります。
CygwinのgccにはCreateFile()関数はありませんが、fopen()関数が内部でCreateFile()を呼び出していると考え、ためしに以下の内容で実験してみました。
結果としては、ちゃんとアクセスできましたので、記事としてまとめます。
この方法は、手順を間違えるとドライブのデータを破壊してしまう可能性があります。
十分注意してご使用ください。
MSDNライブラリの情報によると、論理ドライブ(パーティション)への直接アクセスは、CreateFile関数を使用し、
"\\.\c:"の様に使用するとあります。実は、gccのfopenでも同様の引数で論理ドライブにアクセスできます。
int main(void){ FILE* fp; // c:ドライブをオープンする fp = fopen("\\\\.\\c:","rb");
これで、パーティションにアクセスできます。
freadやfwrite、fseekなども使用できます。
物理ドライブへのアクセスは、以下のようにします。
int main(void){ FILE* fp; // PHYSICALDRIVE1ドライブをオープンする fp = fopen("\\\\.\\PHYSICALDRIVE1","rb");
このように指定する場合には、ドライブのセクタ0(MBR=Master Boot Record)からアクセスできます。
また、セクタサイズがsの場合、セクタxにシークさせるには、以下のように指定します。
fseek(fp,x*s;0);