Click here to Skip to main content
Click here to Skip to main content

Tail utility for windows

, 18 Jan 2004
Rate this:
Please Sign up or sign in to vote.
Tail utility for windows

Introduction

This simple program imitates the unix "tail -f" utility on windows.

Source code and Demo

The submitted source code contains one main file: Tail.cs. This is the core of the tail program. This file is used in two wrappers - a GUI wrapper and a CUI wrapper. The two projects in the solution illustrate using Tail.cs in a windows form application and a console application.

Code Walkthrough

.NET introduced the FileSystemWatcher, which is the main component of this program. By configuring this component one can listen to file system changes.

I first check whether the file exists. If it does exist then I monitor any changes to the file thus:

fileSystemWatcher.Changed += new FileSystemEventHandler(TargetFile_Changed);

If it does not exist yet, then I wait until the file is created before watching for file change notifications:

fileSystemWatcher.Created += new FileSystemEventHandler(TargetFile_Created);

When a change is made to the file, the method below gets the notification

  public void TargetFile_Changed(object source, FileSystemEventArgs e)
  {
   lock (this)
   {
    byte[] bytesRead = new byte[maxBytes];
    FileStream fs = new FileStream(this.filename, FileMode.Open);
    if (fs.Length > maxBytes)
    {
     this.previousSeekPosition = fs.Length - maxBytes;
    }
    this.previousSeekPosition = (int)fs.Seek(
        this.previousSeekPosition, SeekOrigin.Begin);
    int numBytes = fs.Read(bytesRead, 0, maxBytes);
    fs.Close();
    this.previousSeekPosition += numBytes;  

    StringBuilder sb = new StringBuilder();
    for (int i=0; i<numBytes; i++)
    {
     sb.Append((char)bytesRead[i]);   
    }

    this.MoreData(this, sb.ToString());
   }
  }

Within this, I ensure that the last characters are read in a large file which is longer than the number of characters that can be read. I then read the last set of characters starting from where we left off the previous time. The string of new characters is then sent to all listeners.

The sample programs listen to this notfication and then updates its user interface.

Issues

I have noticed an occasional exception saying that the target file is being accessed by another program. In the environment that I am working in, the target file is not always opened for writing, so I am able to get away with the above code for now. If it works, don't touch it uh. Smile | :) But you feel free to correct it and post changes.

Bug Fixes

  • Added fix for file access exception. Thanks to Gary a.k.a garythom_work for this fix. (see thread below) - 17 Jan 2004

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

SathishVJ

France France
~/sathishvj

Comments and Discussions

 
QuestionCross-thread operation not valid PinmemberTinyTony_16-Oct-13 0:05 
BugWell, this definitely does not work PinmemberZacky Pickholz20-Nov-12 8:05 
GeneralSlower than native code... Pinmembertherearefartoomanybens10-Mar-09 11:56 
GeneralRe: Slower than native code... PinmemberDEGT24-Sep-09 1:14 
GeneralNice little utility Pinmemberrc_cohn10-Nov-05 12:11 
GeneralSome text editors does not trigger fileSystemWatcher.Changed event! PinmemberTomer Shalev3-Aug-05 7:32 
GeneralRe: Some text editors does not trigger fileSystemWatcher.Changed event! Pinmembermeraydin2-Dec-05 6:51 
GeneralUse in threads Pinmemberbollwerj24-May-04 8:11 
GeneralRe: Use in threads PinmemberDEGT24-Sep-09 1:36 
The file system watcher runs in its own thread which is different than the user interface/console thread.
 
I haven't looked into this tool in detail because I wrote my own. And you see that if in the File System Watcher events (Created/Deleted/Renamed/Changed/Error) you attempt to use any of the UI widgets (rich text box, etc.) you get an Invalid Operation Exception indicating that you attempted to modify a widget (UI control) from another thread.
 
Because of that you have to use the Invoke construct to operate on UI controls from within the file system watcher event handlers.
 
But in short, the FSW does its own threading so you don't have to worry about it.
 
http://www.PanamaSights.com/
http://www.coralys.com/
http://www.virtual-aviation.info/

GeneralCall to TargetFile_Changed Pinmemberbollwerj28-Apr-04 9:41 
GeneralRe: Call to TargetFile_Changed PinmemberSathishVJ28-Apr-04 18:38 
GeneralRe: Call to TargetFile_Changed Pinmemberbollwerj30-Apr-04 3:55 
GeneralRe: Call to TargetFile_Changed Pinmemberbollwerj3-May-04 2:38 
GeneralAn Alternative PinmemberGary Brewer14-Feb-04 5:13 
GeneralTraceTool and Tail windows PinmemberThierry Parent19-Jan-04 20:59 
GeneralFree SFU 3.5 PinsussAnonymous19-Jan-04 7:40 
Questionwhat does tail -f do? Pinmemberpeterchen19-Jan-04 1:46 
AnswerRe: what does tail -f do? PinmemberSathishVJ20-Jan-04 3:34 
GeneralThows an Exception Pinsussgarythom_work15-Jan-04 5:03 
GeneralRe: Thows an Exception PinmemberSathishVJ20-Jan-04 3:27 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.141015.1 | Last Updated 19 Jan 2004
Article Copyright 2004 by SathishVJ
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid