create_symlink()

ハードリンクとシンボリックリンクの作成関数を追加しました。
symlink.cppの差分
id:y-hamigaki:20061110 に書いたとおり、Vistaシンボリックリンクはファイルとディレクトリで別物なので、それぞれcreate_file_symlink()とcreate_directory_symlink()を使うようにしました。
また、TR2との互換性と利便性から、ファイル/ディレクトリ共用のcreate_file()も作っています。
create_file()はターゲットパスの種類を判定し、create_file_symlink()とcreate_directory_symlink()を呼び分けることで実装しています。
この方法ではターゲットパスが存在しない場合に、どちらを呼ぶかが問題になります。
対処としては、

  1. エラーを返す
  2. 拡張子が付いていたらファイル、ない場合はディレクトリと判断する
  3. 2.に加えて、MakefileやJamfileなどの良く使うファイル名を考慮する

などが考えられます。
しかし、ファイル名での判定は用途によって要求が異なることがあり、ライブラリ側で決定することはできません。
ここでは、単純にエラー(ERROR_PATH_NOT_FOUND)を返し、呼び出し側に適切な処理を委ねる形を取りました。


一方、POSIX版はlink()/symlink()を呼んでいるだけです。
今のところ、create_symlink()、create_file_symlink()、create_directory_symlink()は全て同じ動作をします。
create_file_symlink()とcreate_directory_symlink()では、ターゲットの種類を判定したほうが良いかもしれません。


あと、既定で_WIN32_WINNT=0x0500でコンパイルされるようにしたので、NTFS状態変更時間/リパースポイント/ハードリンクが有効になっています。