Windowsで、CDからISOイメージを作成(抽出)してみる

さっきのforコマンドのことを調べていて見っけました。CDからISOイメージを作成(抽出)するには、Linuxだとddコマンドやmkisofsコマンドを使いますよね。

Windowsには/dev/cdromや/mnt/cdromはないので、Cygwinを使うか専用のツールを用意する必要がある、と思ってました。しかーし! よくよく考えてみれば\\?\CdRom0というわけのわからないものがあるじゃないかっ。
ということで、copyコマンドやxcopyコマンドで試してみました…が、失敗。だめもとで自分でプログラムを書いてみることに。しかもJavaで。

import java.io.*;

public class Copy {
  public static void main(String[] args) throws IOException {
    InputStream  in  = null;
    OutputStream out = null;

    try {
      in  = new FileInputStream(args[0]);
      out = new FileOutputStream(args[1]);

      final byte[] buf = new byte[4096];
      int          len;

      // このへんはいいかげんに書いたのでバグってるかも
      while((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
      }
    } finally {
      try {
        if(in != null) {
          in.close();
        }
      } finally {
        if(out != null) {
          out.close();
        }
      }
    }
  }
}

おそるおそる実行してみると…

C:> java Copy \\?\CdRom0 test.iso

C:>

…ISOイメージ、できたっぽいぞっ! test.isoをVMwareでCD-ROMドライブとしてアクセスしてみたら、ちゃんと認識してくれました。
ということで、C/C++でも同様にすればISOイメージを作成できそうです。いま手もとにC/C++コンパイラがないので確認できませんが。
なお、マルチセッションなCDとかコピーガードなCDでは試してません。たぶんだめでしょうね。
あと、Javaの環境はJRE 5.0 Update 6です。J2RE 1.4.xとかではたぶんだめだと思います。