テキストファイルからバイト数を取得 – プログラミング – Home

テキストファイルからバイト数を取得
 
通知
すべてクリア

[解決済] テキストファイルからバイト数を取得


ビオ
 ビオ
(@ビオ)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

開発環境:WindowsXP:VC++6.0

ファイル操作のBOOL ReadFile()で任意のテキストファイルを読み込みをしたいのですが
テキストファイルにはチャットのログを保存しているので、テキストファイルのバイト数が常に変わり
第3引数のサイズをうまく指定できません。

そこで、BOOL ReadFile()の前に一度、テキストファイルのバイト数を取得して
その取得した値を、指定したいと思っているのですが
テキストファイルのバイト数を取得する方法が、調べているのですが
VBでの方法しか探せなく手詰まりしています。

申し訳ございませんが、ご教授お願い致します。


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

GetFileSizeとか……
http://msdn.microsoft.com/library/en-us/fileio/base/getfilesize.asp

そもそも,一度のReadFile読む必要はないわけでして……。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

ファイルサイズを取得した後、読み込みが完了する前に、チャットクライアントによっ
てログが追記されてしまったら、すべて読み込むことはできません。
追記できないように排他制御をかけると、チャットクライアントの作りによっては落ち
るかもしれません。
やはり、複数回の ReadFile で読める限り読む、というアプローチが良いかと思われま
す。


返信引用
ビオ
 ビオ
(@ビオ)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

YuOさん
シャノンさん
ご返答ありがとうございました。

>そもそも,一度のReadFile読む必要はないわけでして……。

すみません・・・なぜ読む必要が無いのか教えていただけますか?

>ファイルサイズを取得した後、読み込みが完了する前に、
>チャットクライアントによっ
>てログが追記されてしまったら、すべて読み込むことはできません。

ログをとるタイミングは、通信を遮断したときなので
これは、問題ないと思います。

現在やろうとしていますのが
CreateFile()でテキスト作成 or オープン

GetFileSizeでログの入ったテキストファイルのバイト数取得

ReadFileで、取得した値を指定しテキストを読み込み、Stringで宣言した変数に代入

チャットで溜まったログを、Stringで宣言した変数へ代入
(日付が新しいのを上に持っていきたいので)

Stringで宣言した変数を、 + を使いくっ付ける

WriteFile()でテキストファイルに保存する。
第2引数にString変数
第3引数にログのバイト数+ReadFileで読み込みしたバイト数
を指定しています。

他に良いやり方がありましたら
ご教授お願い致します。

宜しくお願いします。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

>>そもそも,一度のReadFile読む必要はないわけでして……。
>すみません・・・なぜ読む必要が無いのか教えていただけますか?

ReadFile の第3引数はファイルから読み込みたいバイト数であって、ファイルサイズで
はありません。
ファイルサイズがいくらだかわからないなら、少しずつ読み込んで、後でつなげたって
いいんです。
それに、ファイルサイズが馬鹿でかかったら、そのために確保するメモリも馬鹿でかく
なってしまいます。

特に、今回のように、先頭に追記する場合、

CreateFile()で一時テキストファイル作成

先頭に追記したいログのバイト数を求め、WriteFile で書き込み

CreateFile()で、過去ログファイルオープン

ReadFileで、過去のログから一定バイト数(1kBとか)読み込み(※1

WriteFile で、ReadFile で読んだバイト数だけ、一時ファイルに書き込み

過去ログを全部読み終わるまで、※1 との間をループ

過去ログファイルを閉じて削除

一時ファイルを閉じて、過去ログファイルと同じ名前にリネーム

としておけば、処理に必要なメモリは常に、ReadFile で読み込む一定バイト数だけで済
みます。


返信引用
ビオ
 ビオ
(@ビオ)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

シャノンさん
レスありがとうございます。

質問なのですが

>過去ログファイルを閉じて削除
>一時ファイルを閉じて、過去ログファイルと同じ名前にリネーム
削除といいますのは、
プログラム上からテキストファイルを削除する。
という事ですよね。
どういった、関数を用いてやれば良いか教えて頂けますか?

リネームですが、CreateFileで作り直せば良いのでしょうか?

>ReadFile の第3引数はファイルから読み込みたいバイト数であって、
>ファイルサイズではありません。
すみません・・・自分ではバイト数と書いたつもりでした^^;
間違えて書いていました。。


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 23年前
投稿: 310
 

DeleteFile


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

リネームはMoveFileで。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

>>ReadFile の第3引数はファイルから読み込みたいバイト数であって、
>>ファイルサイズではありません。
>すみません・・・自分ではバイト数と書いたつもりでした^^;
>間違えて書いていました。。

いや、論点がずれているような気がします。
バイト数云々ではなくて、「ファイルサイズ」ではなくて「読み込みたいサイズ」を
指定するという部分に注目するべきです。
一気に読まなくても少しずつ読んで最終的にEOFまで読めばよいのは、
既に指摘されている通りです。

やりたい処理を実現する方法は必ずしも一つとは限りません。
見方を変えるだけでもっとすっきりわかりやすい処理で実現できる事もあります。
同じ処理をするにもより効率の良い方法や少ないコードで表現できる方法を考えると
面白いと思います。
最初に自分が考え付いた方法以外にもっとうまい方法が無いかどうか考えていると
勉強になってよいと思います。


返信引用
ビオ
 ビオ
(@ビオ)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

無事、完成致しました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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