開発環境:WindowsXP:VC++6.0
ファイル操作のBOOL ReadFile()で任意のテキストファイルを読み込みをしたいのですが
テキストファイルにはチャットのログを保存しているので、テキストファイルのバイト数が常に変わり
第3引数のサイズをうまく指定できません。
そこで、BOOL ReadFile()の前に一度、テキストファイルのバイト数を取得して
その取得した値を、指定したいと思っているのですが
テキストファイルのバイト数を取得する方法が、調べているのですが
VBでの方法しか探せなく手詰まりしています。
申し訳ございませんが、ご教授お願い致します。
GetFileSizeとか……
http://msdn.microsoft.com/library/en-us/fileio/base/getfilesize.asp
そもそも,一度のReadFile読む必要はないわけでして……。
ファイルサイズを取得した後、読み込みが完了する前に、チャットクライアントによっ
てログが追記されてしまったら、すべて読み込むことはできません。
追記できないように排他制御をかけると、チャットクライアントの作りによっては落ち
るかもしれません。
やはり、複数回の ReadFile で読める限り読む、というアプローチが良いかと思われま
す。
YuOさん
シャノンさん
ご返答ありがとうございました。
>そもそも,一度のReadFile読む必要はないわけでして……。
すみません・・・なぜ読む必要が無いのか教えていただけますか?
>ファイルサイズを取得した後、読み込みが完了する前に、
>チャットクライアントによっ
>てログが追記されてしまったら、すべて読み込むことはできません。
ログをとるタイミングは、通信を遮断したときなので
これは、問題ないと思います。
現在やろうとしていますのが
CreateFile()でテキスト作成 or オープン
↓
GetFileSizeでログの入ったテキストファイルのバイト数取得
↓
ReadFileで、取得した値を指定しテキストを読み込み、Stringで宣言した変数に代入
↓
チャットで溜まったログを、Stringで宣言した変数へ代入
(日付が新しいのを上に持っていきたいので)
↓
Stringで宣言した変数を、 + を使いくっ付ける
↓
WriteFile()でテキストファイルに保存する。
第2引数にString変数
第3引数にログのバイト数+ReadFileで読み込みしたバイト数
を指定しています。
他に良いやり方がありましたら
ご教授お願い致します。
宜しくお願いします。
>>そもそも,一度のReadFile読む必要はないわけでして……。
>すみません・・・なぜ読む必要が無いのか教えていただけますか?
ReadFile の第3引数はファイルから読み込みたいバイト数であって、ファイルサイズで
はありません。
ファイルサイズがいくらだかわからないなら、少しずつ読み込んで、後でつなげたって
いいんです。
それに、ファイルサイズが馬鹿でかかったら、そのために確保するメモリも馬鹿でかく
なってしまいます。
特に、今回のように、先頭に追記する場合、
CreateFile()で一時テキストファイル作成
↓
先頭に追記したいログのバイト数を求め、WriteFile で書き込み
↓
CreateFile()で、過去ログファイルオープン
↓
ReadFileで、過去のログから一定バイト数(1kBとか)読み込み(※1
↓
WriteFile で、ReadFile で読んだバイト数だけ、一時ファイルに書き込み
↓
過去ログを全部読み終わるまで、※1 との間をループ
↓
過去ログファイルを閉じて削除
↓
一時ファイルを閉じて、過去ログファイルと同じ名前にリネーム
としておけば、処理に必要なメモリは常に、ReadFile で読み込む一定バイト数だけで済
みます。
シャノンさん
レスありがとうございます。
質問なのですが
>過去ログファイルを閉じて削除
>一時ファイルを閉じて、過去ログファイルと同じ名前にリネーム
削除といいますのは、
プログラム上からテキストファイルを削除する。
という事ですよね。
どういった、関数を用いてやれば良いか教えて頂けますか?
リネームですが、CreateFileで作り直せば良いのでしょうか?
>ReadFile の第3引数はファイルから読み込みたいバイト数であって、
>ファイルサイズではありません。
すみません・・・自分ではバイト数と書いたつもりでした^^;
間違えて書いていました。。
DeleteFile
リネームはMoveFileで。
>>ReadFile の第3引数はファイルから読み込みたいバイト数であって、
>>ファイルサイズではありません。
>すみません・・・自分ではバイト数と書いたつもりでした^^;
>間違えて書いていました。。
いや、論点がずれているような気がします。
バイト数云々ではなくて、「ファイルサイズ」ではなくて「読み込みたいサイズ」を
指定するという部分に注目するべきです。
一気に読まなくても少しずつ読んで最終的にEOFまで読めばよいのは、
既に指摘されている通りです。
やりたい処理を実現する方法は必ずしも一つとは限りません。
見方を変えるだけでもっとすっきりわかりやすい処理で実現できる事もあります。
同じ処理をするにもより効率の良い方法や少ないコードで表現できる方法を考えると
面白いと思います。
最初に自分が考え付いた方法以外にもっとうまい方法が無いかどうか考えていると
勉強になってよいと思います。
無事、完成致しました。
ありがとうございました。