[リストへもどる]
一括表示

投稿時間:2003/07/16(Wed) 12:59
投稿者名:イツキ
Eメール:
URL :
タイトル:
テキストファイルの内容を1行だけ削除したい
あるプログラムを作成中で、そのプログラムでエラーなどが発生した場合にエラーログファイルに、
エラー内容を書き出します。しかし、今後ずっと使っていくプログラムの為、ログファイルを際限なく
追加するだけでは、HDDの容量を喰い過ぎてしまいます。
そこでログファイルのサイズを制限し、1MBまでは無条件追加とし、1MBを超えると1件
追加するたびに、1件削除しようと思います。
ログは1件=1行でテキストファイルの書き込む予定です。
ここで、一番古い1件のログを削除したいのですが、1行のみ削除というのは、どのように
すればいいでしょうか?

当初は、ログファイルの内容をすべて配列に読み込み、ログファイルを削除した後、
同じ名前のログファイルに配列から最初の1件のみ飛ばして、すべて書き込みます。その上で、
1件のログを追加という形でしていたのですが、はっきりいうとあまりにもダサイと思っているのです。

どうかよろしくお願い致します。

投稿時間:2003/07/16(Wed) 13:35
投稿者名:匿名
Eメール:
URL :
タイトル:
Re: テキストファイルの内容を1行だけ削除したい
数日前に下記に投稿されていたと思います。
マルチポストは禁止とここのHPでも書かれていますよ。

http://www2j.biglobe.ne.jp/~little-g/vbtomo.html

投稿時間:2003/07/16(Wed) 16:55
投稿者名:イツキ
Eメール:
URL :
タイトル:
Re^2: テキストファイルの内容を1行だけ削除したい
マルチポスト禁止というご指摘は真摯に受け止めています。
ご指摘のBBSですが、投稿したのですが、その後私の投稿は見つからず、HP上の表示設定やヘルプを参照しましたが、結局見つけれず、管理人に相談しようと思っています。

投稿時間:2003/07/16(Wed) 13:48
投稿者名:nanashi
Eメール:
URL :
タイトル:
Re: テキストファイルの内容を1行だけ削除したい
http://www.naka-net.com/y-mac/custombbs.cgi?no=12371&reno=no&oya=12371&mode=msg_view

↑ここでも聞いてましたよね。

ログファイルの形式とログの管理手段を見直してみてはいかがでしょうか?
例えば私が使っている方法ですが、iniファイル形式(セクションを日付、キーを時間)でログを出力して、
一定期間以上経ったログを日付単位で削除するようにしています。
これなら追加も削除もAPIで簡単に行えますし。

投稿時間:2003/07/16(Wed) 16:54
投稿者名:イツキ
Eメール:
URL :
タイトル:
Re^2: テキストファイルの内容を1行だけ削除したい
> http://www.naka-net.com/y-mac/custombbs.cgi?no=12371&reno=no&oya=12371&mode=msg_view
>
> ↑ここでも聞いてましたよね。
BBSの初心者なので、質問させて下さい。
確かに聞いておりました。このサイトにはお礼を書き、それ以上投稿がないようにお願いしたつもりですが、そ
の場合もマルチポストと呼ばれるマナー違反になってしまうのでしょうか?

> ログファイルの形式とログの管理手段を見直してみてはいかがでしょうか?
確かに、このやり方もあると思います。社内のメンバーと一度検討したいと思います。

投稿時間:2003/07/16(Wed) 15:41
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: テキストファイルの内容を1行だけ削除したい
スマートではありませんが、少しでも高速に処理したいなら、下記の方法でも。

Private Sub Command1_Click()
    Dim DelTxt      As String
    Dim Fso         As New FileSystemObject
    Dim FsoTS       As TextStream
    Dim DelByt      As Long
    Dim FilePath    As String
    Dim bytArray2() As Byte
    Dim bytArray()  As Byte
    Dim intFileNo   As Integer
    Dim lngFileLenB As Long
    FilePath = App.Path & "\test.txt"
    Set FsoTS = Fso.OpenTextFile(FilePath)
    DelTxt = FsoTS.ReadLine
    FsoTS.Close
    Set FsoTS = Nothing
    DelByt = LenB(StrConv(DelTxt, vbFromUnicode)) + 2
    lngFileLenB = FileLen(FilePath)
    ReDim bytArray2(DelByt - 1)
    ReDim bytArray(lngFileLenB - DelByt - 1)
    intFileNo = FreeFile
    Open FilePath For Binary As #intFileNo
    Get #intFileNo, , bytArray2
    Get #intFileNo, , bytArray
    Close #intFileNo
    Kill FilePath
    intFileNo = FreeFile
'   Text1.Text = StrConv(bytArray, vbUnicode)

    Open FilePath For Binary Access Write As #intFileNo
        Put #intFileNo, , bytArray
    Close #intFileNo
End Sub

# 2003/08/05 訂正

投稿時間:2003/07/16(Wed) 16:50
投稿者名:イツキ
Eメール:
URL :
タイトル:
Re^2: テキストファイルの内容を1行だけ削除したい
有難う御座います。

このやり方ですと、確かに出来ると思うのですが、更に質問させて下さい。
やはり、テキストファイルから、1行だけ削除する為のメソッド・API関数等はなく、コードで実現しなければならないのでしょうか?

投稿時間:2003/07/16(Wed) 17:02
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: テキストファイルの内容を1行だけ削除したい
> やはり、テキストファイルから、1行だけ削除する為のメソッド・API関数等はなく、
>コードで実現しなければならないのでしょうか?

テキストファイルに限らず、シーケンシャルやランダムファイルでも同様に
1行だけ削除する為のメソッド・API関数等はありません。
ただ、問題になるのは処理速度かと思います。前記の方法ですと1Mのファイルでも
0.2秒程度で処理できますので、実用上は仮にAPIがあったとしても目に見えて差が
解る程度にはならないかと思いますし、コードの記入もそうは変わらないかと思います。
関数化でもしておけば、使い回しもできますし。

又、1行当たりのバイト数を空白を付加する等して統一しておけば
もっと簡単に処理できるかと思います。

投稿時間:2003/07/16(Wed) 17:06
投稿者名:イツキ
Eメール:
URL :
タイトル:
解決しました。
この方法で、対応したいと思います。有難う御座いました。

マナー違反であると指摘を受けた私の投稿に、ご返信頂き本当に感謝しています。
匿名様からの回答は、お待ちしていますが、この問題は解決です。