跟踪文本文件中新文本的可靠方法



我正在尝试制作一个程序来跟踪文本文件列表中的更改(仅附加类型的更改(。使用FileStream类时,我遇到ArgumentException告诉";偏移量和长度超出了数组的界限或计数大于从索引到源集合末尾的元素数";。此外,我很惊讶地发现,我不能使用long来标记偏移量——那么我该如何读取巨大的文件呢?附言:肯定不会有大量的新文本。

public partial class mainForm : Form
{
FileSummary initialSnap;
public mainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
filePath_textBox.Text = openFileDialog1.FileName;
}
}
private void checkButton_Click(object sender, EventArgs e)
{
if (initialSnap == null)
{
initialSnap = new FileSummary(filePath_textBox.Text);
return;
}
FileSummary newSnap = new FileSummary(initialSnap.FullName);
var dateBefore = initialSnap.LastWriteTime;
var dateAfter = newSnap.LastWriteTime;
if (dateBefore == dateAfter) return;
var deltaLength = newSnap.Length - initialSnap.Length;
var prevLength = (int)initialSnap.Length;
using (FileStream fstream = File.OpenRead(initialSnap.FullName))
{
byte[] array = new byte[deltaLength];
fstream.Read(array, prevLength, array.Length);
string addedText = System.Text.Encoding.Default.GetString(array);
}
}
}
internal class FileSummary
{
public FileSummary(string fileFullPath)
{
FullName = fileFullPath;
FileInfo fi = new FileInfo(fileFullPath);
LastWriteTime = fi.LastWriteTime;
Length = fi.Length;
}
public string FullName { get; internal set; }
public DateTime LastWriteTime { get; internal set; }
public long Length { get; private set; }
}

对fstream的调用。代码中的Read((不正确。Read方法第二个参数是文件内容所在的目标字节数组的偏移量,它不是您误解的文件中的起始偏移点。

这条线导致了错误,

fstream.Read(array, prevLength, array.Length);

必须将其更改为,

fstream.Seek(prevLength , SeekOrigin.Begin);
fstream.Read(array, 0, array.Length);

因此,如果只需要获取新写入文件的部分,则需要首先将seek写入到上一个结束位置,读取delta文件内容,然后填充字节数组。请参阅Read((文档。这就是为什么,Read((方法采用int作为偏移量,而不是long,因为偏移量用于数组缓冲区,而不是文件。

最新更新