DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ファイル操作

  • 題名: ファイル操作
  • 著者: しば
  • 日時: 2006/12/19 11:34:30
  • ID: 18582
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[NET Framework1.1 Win XP]
分類:[.NET]

バックアップ処理で
ログファイル(テキストファイル)を出力してます

例:
処理開始日時=2006/12/12 14:49:50
≪ファイルコピー≫
バックアップ先=...
COPYFROM00=C:\...
2006/12/12 14:53:33 開始
2006/12/12 14:54:34 終了
...


処理完了後に
ファイルサイズが2MB以上になった場合
最後の200KBのみ残して削除したいのですが

どの様な方法があるのか教えてください

現状考えているのは
ファイルを読込みし(行毎に)
行→Byte変換したサイズを累積判定
1800KB以降の行を退避
全て読込んだ後に退避→上書きする
(こんなのでいいのか?)
とりあえず、
テキストファイルはUnicodeで保存されているのでしょうか?

でないと
>最後の200KBのみ残して削除したいのですが
のときに文字コードによって文字が分断される可能性があると思いますけど)
(UTF16でも分断される可能性がありそう。UTF32なら大丈夫なのかな。(200K≡0 (mod 4)))

文字コードなんて関係ないのであれば、バイナリファイルとして扱ったほうが
簡単そうです。
Blueさま
回答有難うございます

>テキストファイルはUnicodeで保存されているのでしょうか?
意識していませんが
普通に StreamWriter(Encoding指定なし) で出力し
ているだけで特に文字バケもしていません

>文字コードなんて関係ないのであれば、バイナリファイルとして扱ったほうが
>簡単そうです

行内で分断されるのはさけたいのですが
バイナリで全体を取得し
ある一定の位置(1800KB)から改行コード以降の
位置を判定&バイナリに再格納する???
事なのでしょうか?
■No18587に返信(しばさんの記事)
> 普通に StreamWriter(Encoding指定なし) で出力し
> ているだけで特に文字バケもしていません
ということはUTF-8かなぁ?

バイト数というのは、UTF-8でのバイト数でしょうか?
>行→Byte変換したサイズ
ここは間違いなく文字コードが絡むでしょう。

>ファイルを読込みし(行毎に)
これはログを吐き出す毎にに行うということですね。
文字コードをバイト数にするのであれば、ここで2MBのチェックが出来そうですけど。
(単にファイルサイズでよさげ。但しUTF-8だからBOMが頭についているのかな)


もうすでに、書かれている方法でやっていくでしょうね。
(バイナリファイルに文字列は追記できないのでエンコードして追記することになりますけど)
Blueさま
回答有難うございます

>バイト数というのは、UTF-8でのバイト数でしょうか?
すいません得に意識していません
わかりません
(メモで開くと問題ないのですが秀丸だとバケでいる)

>行→Byte変換したサイズ
さんぷるでSHIFT-JISコード変換していたので
そのままコピリました

現状、単なるファイルサイズと
BYTE変換後のサイズ合計が若干違いますが
文字コードが関係するのでしょうか?


1日のログ出力で〜20行程度しか出力されない
ので正確に200KB残す必要はないのですが・・
(最悪本日分が消えなければOK)

とりあえず、最初の案でやってみて
問題があれば、また質問します
(バイナリ操作はコードが浮かばないので
まずは、解る方法でやってみます)
>(メモで開くと問題ないのですが秀丸だとバケでいる)
メモ帳で開けるとなると、Shift_JIS?

秀丸でも文字コード変換して閲覧することが出来ますよ。
(秀丸もっていないのでどうするか具体的にかけませんが。。。)

>さんぷるでSHIFT-JISコード変換していたので
Shift_JISならこれでいいのですが、ほかの文字コードであると不味いです。
同じ文字を表すのでもサイズが違っています。

>現状、単なるファイルサイズと
>BYTE変換後のサイズ合計が若干違いますが
>文字コードが関係するのでしょうか?
そのとおりです。
全体バイト数初期化

ログファイルを1行読む

『1行の』バイト数を計算

全体バイト数+1行のバイト数が1.8MB未満ならば廃棄
それ以上は行データをメモリ上か何かに保存

読み終えたら保存しておいたものを改めて上書き出力

という流れですね。

この処理の場合は『行単位』で保存する/しないを決めているので、Blueさんの懸念
する「文字コードによる分断」は無さそうです。
アルゴリズム的にどうかしら〜的な部分はありますが、まぁいいや。
それはそれとして。

> >バイト数というのは、UTF-8でのバイト数でしょうか?
> すいません得に意識していません
> わかりません
> (メモで開くと問題ないのですが秀丸だとバケでいる)

> >行→Byte変換したサイズ
> さんぷるでSHIFT-JISコード変換していたので
> そのままコピリました

…これはないです。
というか自分が操作しようとしているファイルの文字コードぐらいは知っておいて下さい。
StreamWriter(String) はMSDNによればBOMなしUTF-8のようですね。
http://msdn2.microsoft.com/ja-jp/library/fysy0a4b(VS.80).aspx

それにShift-JIS変換などかけたらわけわかめになること間違いなしですけど。
そもそも自分が書いているファイルの文字コードが不明なのに、それに対してシフト
JIS変換(しかもサンプルからのコピペ)をかけてバイト数計算だなんて、あまりにお
粗末すぎませんか?

UTF-8でこのまま行くならUTF-8でバイト数を計算する必要があるし、シフトJIS変換
でバイト数を得るならログファイルの文字コードをシフトJISに変更する必要があるでしょ
う。
そのあたりを少し考えてみてください。

DOBON.NET | プログラミング道 | プログラミング掲示板