• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:windowsのC#での話です。あるプロセスが断続的(数秒程度で一定し)

C#でtail -fを実行する方法

このQ&Aのポイント
  • C#でtail -fコマンドのようにファイルを監視するプログラムを作成する方法について説明します。
  • ファイルをオープンして最後までseekし、その後は1秒ごとにファイルの内容を読み込み続けるプログラムを作成することができます。
  • ただし、この方法では他のプログラムがログファイルに書き込むことができなくなるため、注意が必要です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> FileStream("logfile.txt", FileMode.Open, FileAccess.Read, FileShare.Read)  アクセス制御の指定がFileShare.Readなので、他のプロセスは読込しかできなく、書き込もうとしたらエラーになります。ここは他のプロセスのアクセスを制御するパラメータなので、  FileShare.Write または  FileShare.ReadWrite を指定する必要があります。

Kiyo9876Tokyo
質問者

お礼

なるほど。わかりました。もう一度ヘルプを見直してみて、今更ながらちゃんと理解しました。 どうもありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

ログファイルをフルアクセスで開いて、他のプロセスが書き足してるのに邪魔したらエラーになるのは当然な気がします。 tailの様な事をしたいのであれば、1秒毎にファイルサイズ比較して、増えたらログファイルコピーしてコピーした物開いて、前のファイルサイズ分シークして、増分を出力するとか?(workで作ったファイルは消すなりなんなりするような)

Kiyo9876Tokyo
質問者

お礼

回答ありがとうございます。 ログファイルに内容が追加されていたら毎回コピー、というのはできれば避けたいのですが、、、 回答いただいて申し訳ないのですが、もう少しスマートな方法がほしいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイルのロック

    VB2005です。 以下のコードでファイルを読み取り専用モードで開いています。 FileStream("ファイルパス", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 開くファイルはテキストエディタ等で開くだけでも1分近くかかるファイルです。 上記コードでも、開いているであろう時間(約1分)くらいは ファイルをロックしているようです。 開ききってしまえば、ロックは解除されているようなのですが。 やはりそのファイルを開ききるまではロックしてしまうのでしょうか? これをロックさせない方法はありますか? やりたいことは、開いたファイルの内容を 特定なバイト数で区切、改行キー(終端記号)を加えて 別のファイルに書き出しています。

  • C#でフォルダをロックする方法

    C#でフォルダをロックする方法を教えて下さい。 実現したい挙動は、こんな感じです。 1, コマンドプロンプトで、カレントディレクトリを「C:\test」にする 2, その状態で「C:\test」を削除しようとする 3, 「別のプログラムがこのフォルダを開いているので、操作を完了できません。」(Vistaの場合) つまり、フォルダはコマンドプロンプトのカレントディレクトリになっている間は削除することができませんが、これをコマンドプロンプトではなくプログラムから制御したいのです。(1プログラムで複数) ちなみに、ファイルをロックするのは stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None); という記述でできましたが、わかっていたことですが、フォルダではやはり失敗します。 よろしくお願いします。

  • VB2005で、ファイル操作 VB6から触っていないので感覚がいまいち。

    VB2005で、ファイルを読み込み2行目から10行までを別ファイルに吐き出すコードがわからないのですが、 わかる方教えていただますか? 途中まではできたのですが、後がわかりません。 よろしくお願いいたします。 また、VB2005でわかりやすい書籍など紹介していただけましたら助かります。 'ファイルを開く Dim fs As New System.IO.FileStream(fileName, _ System.IO.FileMode.Open, System.IO.FileAccess.Read) 'ファイルを読み込むバイト型配列を作成する Dim bs(fs.Length - 1) As Byte 'ファイルの内容をすべて読み込む fs.Read(bs, 0, bs.Length) '閉じる fs.Close() ....[改行をLFとした場合に2行から10行目の内容を別のファイルに書き出すコード]

  • 【VB.Net】バイト型配列に読み込んで改行区切り

    教えて下さい。 ファイルをバイト型配列に読み込んで、ある固定長に区切(改行)って出力したいです。 以下簡単にサンプルとして作っているのが以下です。 【読み込みファイル.txt】 ---------------------------------------------------------------------------------- AB ---------------------------------------------------------------------------------- このテキストファイルの内容(byte型では、"41 42")を1バイトづつに改行で区切りたいです。 【VB.Net】 ---------------------------------------------------------------------------------- Dim BUFSIZE As Integer = 1 ' 1バイトづつ処理 Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ Dim readSize As Integer ' Readメソッドで読み込んだバイト数 Dim srcName As String = "C:\Temp\読み込みファイル.txt" ' 読み込みファイル名 Dim dstName As String = "C:\Temp\書き込みファイル.txt" ' 書き込みファイル名 Using src As New FileStream(srcName, FileMode.Open, FileAccess.Read) Using dest As New FileStream(dstName, FileMode.Create, FileAccess.Write) While True ' 1バイト読み込み readSize = src.Read(buf, 0, BUFSIZE) ' 読み込むものが無ければ終了 If readSize = 0 Then Exit While ' 改行いれたい部分(動かないけど、、、) buf = (0D,0A) ' 書き込み dest.Write(buf, 0, BUFSIZE) End While End Using End Using ---------------------------------------------------------------------------------- ↓ 理想の処理後 【書き込みファイル.txt】 ---------------------------------------------------------------------------------- A B ---------------------------------------------------------------------------------- 重要なのはバイト型で処理を行いたいです。(文字列ではない) すいませんがよろしくお願いします。

  • c# 他プロセス起動 リダイレクト(入力) バイナリファイルの場合

    現在、c#で他プロセスを起動させるプログラムを組んでいるのですが、リダイレクトでつまづいています。 (コンパイルが出来ない->どう記述すれば良いのか分からない。) ファイルストリームのReadはデータをByteの配列に格納しますが、リダイレクト入力のwriteはcharの配列を引数としているみたいで、どう記述すれば良いのか分かりません。 記述方法または参考URLを教えていただけないでしょうか? --source--  System.IO.Stream retstream = new FileStream(wkPath, FileMode.Open, FileAccess.Read, FileShare.Read);  System.Diagnostics.Process myProcess = new System.Diagnostics.Process();  myProcess.StartInfo.FileName = "C:\\Program Files\\proc\\process.exe";  myProcess.StartInfo.UseShellExecute = false;  myProcess.StartInfo.RedirectStandardInput = true;  myProcess.StartInfo.RedirectStandardOutput = true;  if (strmInput.Length > 0) {   int num = 0;   byte[] bufWk = new byte[65536];   while (true) {    num = strmInput.Read(bufWk, 0, bufWk.Length);    if (num == 0) {     break;    }    myProcess.StandardInput.Write(bufWk, 0, num); //←コンパイルエラー   }  } --エラー内容-- System.IO.TextWriter.Write(char[], int, int)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。 引数 '1': 'byte[]' から 'char[]' に変換できません。

  • C# Gifアニメーション画像の読込みと表示???

    FormでGIFアニメーション画像を読込み、pictureBoxに表示します (1)の方法では思った通りに表示されます Bitmap GifImage1 = new Bitmap(100, 100); ・・・・・ (1) GifImage1 = new Bitmap(@"f:\TestPattern.gif"); pictureBox1.Image = GifImage1; しかし(2)の方法ではFormをロードするProgram.csでエラーを起こしてしまします Bitmap GifImage2 = new Bitmap(100, 100); ・・・・・ (2) FileStream ImageStream = new FileStream(@"f:\TestPattern.gif", FileMode.Open, FileAccess.Read); GifImage2 = (Bitmap)System.Drawing.Bitmap.FromStream(ImageStream); ImageStream.Close(); pictureBox2.Image = GifImage2; (1)の方法ではファイルがロックされると聞いておりますので、通常は(2)を使用しています またTestPattern.gifがアニメーション画像ではなく単なるGif画像の際は(1)(2)双方ともOKです この辺りの理由をボンクラの私にも分かるように教えてください お願い致します

  • 画像ファイルの幅と高さを取りたい。

    C Sharp、.Net 2.0の環境で開発しています。 using (System.IO.FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)) { imagew = System.Drawing.Image.FromStream(fs).Width; //横幅 imageh = System.Drawing.Image.FromStream(fs).Height; //高さ } ※filePathに画像のパスを入れてます。 上記で画像ファイル(すべてjpg)の縦横の高さを取得しているのですが、 ファイルが大量にあると途中でOutOfMemoryExceptionが発生してしまい 困っています。 メモリ不足にならない、何か別のやり方があればご教授いただけないでしょうか。 宜しくお願いいたします。

  • utf-16 のログを tail -f する方法

    tail -f を使用して utf-16 のファイルを監視したいのですが、gnome-terminal では utf-16 が表示できないようで、文字化けしてしまいます。 $ cat <LOGFILE> | nkf $ head <LOGFILE> | nkf とすることで表示できたのですが、 $ tail -f <LOGFILE> | nkf ではできませんでした。 なんとかして、端末上でログファイルを監視することはできないものでしょうか?

  • [VB.NET] テキスト出力で困ってます(T△T

    すいません、教えて下さい。 Byte型で読み込んだ内容を指定した固定長で出力したいです。 例えば、次のテキストファイルがあります。 【読み込み元.txt】 ------------------------------------------------------- ABC123 ------------------------------------------------------- 文字コードをSJISとしてバイナリ値では「41 42 43 31 32 33」となります。 この値を次のように出力したいです。 【出力先.txt】(3バイト区切りとする) ------------------------------------------------------- 414243 313233 ------------------------------------------------------- なんとか自力で近しい?とこまで行けたのかなと思いますが 肝心の出力がうまくいきません。 【VB.Net】 ------------------------------------------------------- Dim BUFSIZE As Integer = 2048 ' 1度に処理するサイズ Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ Dim readSize As Integer ' Readメソッドで読み込んだバイト数 Dim srcName As String = "C:\Temp\A.txt" ' 読み込み元 Dim detName As String = "C:\Temp\B.txt" ' 出力先 ' 処理開始 Using src As New FileStream(srcName, FileMode.Open, FileAccess.Read) Using dest As New FileStream(destName, FileMode.Create, FileAccess.Write) While True ' 読み込み readSize = src.Read(buf, 0, BUFSIZE) ' 読み込むものが無ければ終了 If readSize = 0 Then Exit While ' 直接16進数を指定固定長で書き込みしたい部分 For i As Integer = 0 To readSize - 1 msgbox buf(i) Next ' 書き込み実行 dest.Write(buf, 0, readSize) End While End Using End Using ------------------------------------------------------- 大変お手数ですがご教示頂ければと思います。

  • .NETによるWAVEファイルの読み込み

    現在、C++でWAVEファイルを読み込みFFTをするツールを.NET Frameworkを使って作っています。 以下が主に作成したプログラムです。 ちなみにtmpFileNameというのが、WAVEファイルのファイル名です。 ----------------------------------------------- FileStream *fs = new FileStream(this->tmpFileName, FileMode::Open, FileAccess::Read); BinaryReader *br = new BinaryReader(fs); try { while(br->PeekChar() >= 0) { Debug::WriteLine(br->ToString()); } } catch(System::Exception *e) { MessageBox::Show(e->ToString()); return; } __finally { __try_cast<IDisposable*>(br)->Dispose(); __try_cast<IDisposable*>(fs)->Dispose(); } ----------------------------------------------- 手始めにバイナリファイルとして読み込み、実際の波形データをコンソールに表示させようとしているのですが、文字化けした結果しか得られませんでした。何が原因でデータが文字化けしているのか分からず、質問した次第です。お分かりになる方いらっしゃいましたら、ぜひご教授下さい。よろしくおねがいします。