ddコマンド

CDのディスクイメージ iso ファイルを作ることがよくあるのですが、Windows環境で単純なダンプコマンドがないので、どうしようかな、と思っています。

Linuxでのddコマンドに相当するプログラムが欲しいので、どんな処理かちょっと調べてみました。

単純にバイトデータを「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なら、これでダンプできます。

package org.sssg.soft.sample.dd;

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 が手に入ります。

java -cp . org.sssg.soft.sample.dd.App \\?\CdRom0 example.iso

関連記事:「hiro345 » 改訂版 基礎 Java について」:プログラミング基礎からJavaを学習したい場合は、こちらをどうぞ。

同じカテゴリの記事: Java