«前の日記(2009年12月26日) 最新 次の日記(2009年12月28日)» 編集

日々をアレコレ


2009年12月27日

VC++でフォルダの存在確認をする

VS2008+Windows7SDKという環境でVC++ MFCでアプリを作成中。アプリの中でファイルを作成するフォルダを直接入力できるテキストボックスを作ったので、ファイルを作成する前にフォルダの存在確認するにあたり詰まったことをメモ。

まず、直接フォルダがあるかどうかを確認する術がSDKやMFCにはない。.NETだとSystem.IO.Directoryクラスがあって、その中のメソッドにExists()があるので楽チンだけどVC++にはない。なので、パスの存在を確認した上で、それがフォルダかどうかを判断して存在を確認するしかない。方法としては次の2つ。

  1. 静的メソッドのCFile::GetStatus()にパスを渡してパスのステータス情報を取得する。
  2. Win32APIのPathFileExists()とPathIsDirectory()を使う。

CFile::GetStatus()はMFCを使うなら標準で使える。けど、パス文字列の末尾が\だった場合にはフォルダが関数自体の戻り値がFALSEとなり情報の取得に失敗する。といっても、これは元々CFileがファイルを扱うクラスであるのが原因だとは思う。なので、末尾に\がある場合は削除して検索する必要がある。

PathFileExists()とPathIsDirectory()の組み合わせでは上記のような問題は起きない。ただし、ライブラリをプロジェクトに追加する必要がある。Windows標準のshlwapi.dllを使うので、shlwapi.libをリンカの依存ファイルとして追加しない動作しない。

正直、どっちを使うのがいいのかいまいちわからない。というのも、存在を確認するだけじゃなくて、無ければフォルダを作成するという場合に、親フォルダへ遡っていく必要が出てくる。その時、CFile::GetStatus()を使う場合には、絶対に末尾に\がないので最後の\前が親フォルダとして認識できる。しかし、PathIsDirectory()の場合はその辺を末尾が\でも動作するので、親フォルダへ遡る際には最後の\の位置がパス文字列の末尾かを判断する必要が出てくる。なので、どっちもどっちなんだよね。


«前の日記(2009年12月26日) 最新 次の日記(2009年12月28日)» 編集