CDのディスクイメージ iso ファイルを作ることがよくあるのですが、Windows環境で単純なダンプコマンドがないので、どうしようかな、と思っています。
Linuxでのddコマンドに相当するプログラムが欲しいので、どんな処理かちょっと調べてみました。
- Koders Code Search: dd.c – C – GPL: http://www.koders.com/c/fid8FA83D210BAE79DA3A7C4088AC9C54909DC88C8D.aspx
単純にバイトデータを「unsigned char型ポインタ変数」の領域へ読み込んで、これをファイルへ書き込むという処理をEOFまでしているだけです。だとすると、JavaでもCでも実装可能です。ただ、Linuxでは 「dd if=/dev/cdrom of=sample.iso」のようにデバイスを指定しますが、Winodwsでの指定はどうすればいいのかが問題となります。それで、ちょっと調べて見たところ、WindowsではCDドライブをデバイス指定する場合は、「\\?\CdRom0」といったようにできるようです。
となると、java.io.FileInputStreamのコンストラクタへ「\\?\CdRom0」を渡すと、入力ストリームが手に入るので、これを使えばよいだけです。次のような org.sssg.soft.sample.Appクラスを作成して実行します。プロテクトがかかっているようなデータはわかりませんが、通常の自作CDやDVDなら、これでダンプできます。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class App {
private InputStream is = null;
private OutputStream os = null;
private final static int BUF_SIZE = 2048;
public void exec(String srcFileName, String dstFileName)
throws IOException {
try {
is = new FileInputStream(srcFileName);
exec1(dstFileName);
} finally {
if (is != null) {
is.close();
}
}
}
public void exec1(String dstFileName) throws IOException {
try {
os = new FileOutputStream(dstFileName);
final byte[] buf = new byte[BUF_SIZE];
int sz;
while ((sz = is.read(buf)) > 0) {
os.write(buf, 0, sz);
}
} finally {
if (os != null) {
os.close();
}
}
}
public static void main(String[] args) throws IOException {
App app = new App();
app.exec(args[0], args[1]);
}
}
実行は次の通り。クラスパスは適切なものを指定してください。これで example.iso が手に入ります。
関連記事:「hiro345 » 改訂版 基礎 Java について」:プログラミング基礎からJavaを学習したい場合は、こちらをどうぞ。