プログラマーズマガジン Windowsでのファイル操作1



 WindowsではCreateFile()、ReadFile()、WriteFile()、CloseHande()関数でファイル の読み書きが可能です。一方、C言語標準のfopen()、fread()、...や open()、read()、...などの関数も使用できます。CreateFile()が返すハンドルと open()が返すファイルディスクリプタとの関係やBINARY、TEXTモードのオープンは どのようになっているのでしょうか?
 これらの関係を調べるにはCコンパイラに付属するランタイムライブラリの ソースコードを見るのが一番簡単な方法だと思います。そこでBorland C++ 4.5の ライブラリソースを見ることにしました。ライブラリのソースはBorland C++ 4.5の 製品CD-ROMの\BC45\SOURCE\RTL\SOURCE\内に格納されています。該当する 関数はこの中のIO\COMMON32とIO\WIN32内に存在します。

ソースコードを調べた結果
(1)open()は内部でCreateFile()を呼び出す。
(2)open()は配列_openfd[]から空のエントリを探しそのエントリをファイルディスクリプタ(fd)とする。
	for(...){
		if(_openfd[fd] == 0){
			fdをファイルディスクリプタとする
			break;
		}
	}

(3)CreateFile()が返すハンドル(handle)は配列_handles[fd]に代入する。
(4)open()で指定する属性(O_TEXTなどは)_openfd[fd]に格納する。
(5)read(fd, ...)はReadFile(_handles[fd], ...)のようにして呼び出す。
(6)read()は、ReadFile()が読み込んだデータに対しO_TEXTなどの属性に応じた加工を行う。
(7)write()などもread()と同じような処理。