FILEとファイルハンドル – プログラミング – Home

通知
すべてクリア

[解決済] FILEとファイルハンドル


赤目
 赤目
(@赤目)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

ファイルサイズを欲しいのですが
FILE*fpはあるのですが
GetFileSizeはハンドルが必要です。
f関数には無いのですが
どうすればサイズを取得できますか?


引用未解決
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

fseek() + ftell() でしょうか。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 21年前
投稿: 1467
 

GetFileSizeはWinAPIですよね?
fopen系の関数ではなく、
CreateFile関数(WinAPI)を使って、ファイルハンドルを取得してください。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 21年前
投稿: 1467
 

> fseek() + ftell() でしょうか。
この場合は、fopenでバイナリ(b)で開いてください。


返信引用
赤目
 赤目
(@赤目)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

即レスありがとうございます。
既にfopenでプログラムが組まれてますので
fseek+ftellを使いたいと思います。
ただ、気になるのはファイルはテキストで開くので
バイナリで開く、シークする、閉じる、テキストで開く、
といった感じで連続で閉じたり開いたりします。
今のところ問題なく動いてますが、
このようなことは危険じゃないですよね?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 21年前
投稿: 1467
 

問題ないと思います。

まぁ開いたり閉じたりが違和感があるならば、

WinAPIのFindFirstFile関数を使ってみるといいです。
これは開かなくても、ファイルパスを指定すれば第2引数に指定した構造体に
ファイルの情報が格納されるので、そこからファイルのサイズが取れます。


返信引用
NowNow
 NowNow
(@NowNow)
ゲスト
結合: 21年前
投稿: 27
 

複数のスレッドやプロセスが同じファイルにアクセスする場合には危険かもしれません。

たとえば、Thread AとThread Bがあるとしたら
Open(A) -> サイズ取得(A) -> Close(A) -> Open(B) -> ファイル編集(B) -> Close(B)
-> Open(A) -> ファイル編集(A)
のようになれば、「サイズ取得(A)」の段階で得られたサイズが「ファイル編集(A)」の段
階でのファイルサイズと一致しないこともあるかもしれません。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

fseek/ftell は long しか使えないので 2GB 以上のファイルには使えないし
そもそも fseek して良いかどうかも判らないし
微妙な線ですね。

とりあえず VC++6 に限るのであれば _get_osfhandle(_fileno(fp)) かな。

GetFileSize(Ex) を使うのが主眼なのであれば最初から CreateFile に一票。
FILE* だけある場合にはファイルサイズを調べなくて済むように書くほうに一票。


返信引用
赤目
 赤目
(@赤目)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

色々レスありがとうございます。

CreateFileに置き換えるのはちょっと変更箇所多いので
FindFirstFileを使うことにします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 21年前
投稿: 1467
 

> とりあえず VC++6 に限るのであれば _get_osfhandle(_fileno(fp)) かな。
_filelength( _fileno( fp ) )
はダメでしょうか?
SetFilePointerでシークさせてサイズを取得しているようですけど。

これなら、FILE*の値だけで(テキストモードでオープンしたファイルパインタ)できるか
も。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました