こんにちは
CreateFileやCFileのOpen関数を呼ばずに、
ファイルのファイルサイズを知る方法というのは、
あるのでしょうか?
GetFileSizeは、CreateFileしたときのファイルハンドル
が必要で、オープン処理を入れずに、
ファイルサイズを知りたいのです。
FindFirstFileで取得したファイルハンドルを
GetFileSizeに渡してもファイルサイズの取得に
失敗しました。
どなたか、ファイルオープンせずにファイルサイズを知る
方法をご存知の方は、ご教授願います。
開発環境は、
VC++.NET
WindowsXP
MFC
です。
> FindFirstFileで取得したファイルハンドルを
> GetFileSizeに渡してもファイルサイズの取得に
> 失敗しました。
FindFirstFileを使ったなら,特殊な状況を除いてファイルサイズは取得できています。
WIN32_FIND_DATA::nFileSizeHighとWIN32_FIND_DATA::nFileSizeLowをチェックしてくだ
さい。
ちなみに,FindFirstFileで得られるのは検索用のハンドルであって,
ファイルオブジェクトを操作するためのハンドルではありません。
ちなみに,「特殊な状況」というのは,対象ファイルがリパースポイントの場合です。
この場合,サイズが0バイトとして報告されてしまうため,
実際に開いてみないことにはファイルサイズは取得できません。
# リパースポイントのEA_DATAには元々データは記録されていない
とりあえず,Vistaが出るまでは,ファイルでリパースポイントなんてことは滅多にない
でしょう。
# ディレクトリで,というのはマウントポイントとして簡単に作成できるが……
ただし,Vista以降ではCreateSymbolicLinkというAPIがあるため,
状況が一変する可能性があります。
http://msdn.microsoft.com/library/en-us/fileio/fs/createsymboliclink.asp
ちなみに CFile クラスの 静的メンバ関数の GetStatus ならば、
ファイル名だけて、CFileStatus 構造体が取得できます。
# 内部ではFindFirstFile関数を使っていますけど。
新ファイルを作成せずに一度「CreateFile」
すればいいんじゃないでしょうか。
「CreateFile」をしてはいけない理由があるんでしょうか。
_stat() とか。
CFile::GetStatus() とか。
>CFile::GetStatus() とか。
既出
>ちなみに CFile クラスの 静的メンバ関数の GetStatus ならば