ファイルサイズを欲しいのですが
FILE*fpはあるのですが
GetFileSizeはハンドルが必要です。
f関数には無いのですが
どうすればサイズを取得できますか?
fseek() + ftell() でしょうか。
GetFileSizeはWinAPIですよね?
fopen系の関数ではなく、
CreateFile関数(WinAPI)を使って、ファイルハンドルを取得してください。
> fseek() + ftell() でしょうか。
この場合は、fopenでバイナリ(b)で開いてください。
即レスありがとうございます。
既にfopenでプログラムが組まれてますので
fseek+ftellを使いたいと思います。
ただ、気になるのはファイルはテキストで開くので
バイナリで開く、シークする、閉じる、テキストで開く、
といった感じで連続で閉じたり開いたりします。
今のところ問題なく動いてますが、
このようなことは危険じゃないですよね?
問題ないと思います。
まぁ開いたり閉じたりが違和感があるならば、
WinAPIのFindFirstFile関数を使ってみるといいです。
これは開かなくても、ファイルパスを指定すれば第2引数に指定した構造体に
ファイルの情報が格納されるので、そこからファイルのサイズが取れます。
複数のスレッドやプロセスが同じファイルにアクセスする場合には危険かもしれません。
たとえば、Thread AとThread Bがあるとしたら
Open(A) -> サイズ取得(A) -> Close(A) -> Open(B) -> ファイル編集(B) -> Close(B)
-> Open(A) -> ファイル編集(A)
のようになれば、「サイズ取得(A)」の段階で得られたサイズが「ファイル編集(A)」の段
階でのファイルサイズと一致しないこともあるかもしれません。
fseek/ftell は long しか使えないので 2GB 以上のファイルには使えないし
そもそも fseek して良いかどうかも判らないし
微妙な線ですね。
とりあえず VC++6 に限るのであれば _get_osfhandle(_fileno(fp)) かな。
GetFileSize(Ex) を使うのが主眼なのであれば最初から CreateFile に一票。
FILE* だけある場合にはファイルサイズを調べなくて済むように書くほうに一票。
色々レスありがとうございます。
CreateFileに置き換えるのはちょっと変更箇所多いので
FindFirstFileを使うことにします。
> とりあえず VC++6 に限るのであれば _get_osfhandle(_fileno(fp)) かな。
_filelength( _fileno( fp ) )
はダメでしょうか?
SetFilePointerでシークさせてサイズを取得しているようですけど。
これなら、FILE*の値だけで(テキストモードでオープンしたファイルパインタ)できるか
も。