Fixed the '\0' in the log from breaking the XmlReader.

This commit is contained in:
moitoius_cp 2008-01-02 12:01:35 +00:00
parent d0a0797e83
commit ac72e642e8
3 changed files with 50 additions and 3 deletions

View file

@ -52,6 +52,7 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="ErrorStrippingFileStream.cs" />
<Compile Include="Handlers\LogHandler.cs"> <Compile Include="Handlers\LogHandler.cs">
<SubType>UserControl</SubType> <SubType>UserControl</SubType>
</Compile> </Compile>

View file

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Cosmos.Kernel.LogTail
{
public class ErrorStrippingFileStream : FileStream
{
public ErrorStrippingFileStream(string file)
: base(file, FileMode.Open, FileAccess.ReadWrite, FileShare.Delete | FileShare.ReadWrite)
{
}
public override int ReadByte()
{
int result;
while ((result = base.ReadByte()) == 0) ;
return result;
}
public override int Read(byte[] array, int offset, int count)
{
int i;
for (i = 0; i < count; i++)
{
int b = ReadByte();
if (b == -1)
return i;
array[offset + i] = (byte) b;
}
return i;
}
}
}

View file

@ -46,7 +46,7 @@ namespace Cosmos.Kernel.LogTail
private void CreateReader() private void CreateReader()
{ {
_fs = new FileStream(_file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); _fs = new ErrorStrippingFileStream(_file);
_watching = true; _watching = true;
_watcher_Changed(this, new FileSystemEventArgs(WatcherChangeTypes.All, "", "")); _watcher_Changed(this, new FileSystemEventArgs(WatcherChangeTypes.All, "", ""));
@ -78,8 +78,16 @@ namespace Cosmos.Kernel.LogTail
if (_watching) if (_watching)
{ {
XmlReader _reader = CreateXmlReader(); XmlReader _reader = CreateXmlReader();
while (_reader.Read()) bool reading = true;
while (reading)
{ {
try
{
reading = true;
reading = _reader.Read();
}
catch { }
LogMessage message = new LogMessage(_reader.Name); LogMessage message = new LogMessage(_reader.Name);
for (int i = 0; i < _reader.AttributeCount; i++) for (int i = 0; i < _reader.AttributeCount; i++)
{ {