【发布时间】:2013-08-05 20:50:37
【问题描述】:
对于某些项目,我需要覆盖文件,但由于用户可能同时使用其他程序编辑此文件,因此我不经常在运行时保留流,而是将所有数据保存在字节数组中。保存我的程序时,应该只保存它编辑的区域,而不是整个文件。我已经(非常糟糕)编写了一个例程来这样做,但它预计会很慢,我不知道如何在这里提高性能。我实际上只是在循环整个数组,并不像看起来那么聪明:
public Boolean Patch(string path)
{
FileStream fs = new FileStream(path, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
BinaryWriter bw = new BinaryWriter(fs);
if (fs.Length != this.rawdata.Length)
throw new ArgumentException();
for (int i = 0; i < this.rawdata.Length; ++i )
{
if (br.ReadByte() != rawdata[i])
{
fs.Position--;
bw.Write(rawdata[i]);
}
}
fs.Close();
return true;
}
【问题讨论】:
-
这似乎是一场灾难。您不想保存整个文件,因为用户可能正在另一个程序中编辑它?您处理的唯一情况是文件大小不同。如果用户更改了您正在更改的确切代码块中的某些内容怎么办?答:您将覆盖他们的更改。本质上,零保证您的应用程序将保留用户所做的临时更改。如果用户从文件开头删除了 3 个字节,但在末尾追加了 3 个字节怎么办?然后一切都不同步了。
-
最好的办法是锁定该文件,在应用关闭之前不要让用户在应用之外编辑它。
标签: c# performance file optimization patch