【发布时间】:2019-08-04 21:55:02
【问题描述】:
我正在尝试修改内联文件流,因为该文件可能非常大,我不想将其加载到内存中。我正在编辑的信息总是相同的长度,所以理论上我可以使用流式阅读器交换内容,但它似乎没有写入正确的位置
我创建了一段代码,使用流阅读器将逐行读取,直到找到正则表达式匹配,然后尝试将字节与编辑的行交换出来。代码如下:
private void UpdateFile(string newValue, string path, string pattern)
{
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
int index = 0;
string line = "";
using (var fileStream = File.OpenRead(path))
using (var streamReader = new StreamReader(fileStream, Encoding.Default, true, 128))
{
while ((line = streamReader.ReadLine()) != null)
{
if (regex.Match(line).Success)
{
break;
}
index += Encoding.Default.GetBytes(line).Length;
}
}
if (line != null)
{
using (Stream stream = File.Open(path, FileMode.Open))
{
stream.Position = index + 1;
var newLine = regex.Replace(line, newValue);
var oldBytes = Encoding.Default.GetBytes(line);
var newBytes = Encoding.Default.GetBytes("\n" + newLine);
stream.Write(newBytes, 0, newBytes.Length);
}
}
}
代码几乎按预期工作,它插入了更新的行,但它总是提前一点,只是多早会根据我正在编辑的文件略有不同。我希望这与我管理流位置的方式有关,但我不知道处理这个问题的正确方法。
不幸的是,我正在处理的确切文件受 NDA 保护。
结构如下: 一个文件将包含未知数量的数据,后跟一行已知格式,例如: 说明:ABCDEF 我知道“描述:”后面的部分将始终为 6 个字符,因此我在行上进行替换以替换为例如 UVWXYZ。 问题是,例如,如果文件读取为
'... 不重要的未知数据 描述:ABCDEF 更多数据 ...'它会像这样出现
'... 不重要的未知描述:UVWXYZDEF 更多数据 ...'【问题讨论】:
-
目前还不清楚您要做什么。请给我们提供文件示例,您要更改的位置以及要更改的内容。
-
查看我的文件结构编辑
-
如果你能分享minimal reproducible example,那就太棒了。 minimal reproducible example 必须能够被复制并粘贴到控制台应用程序中并且无需修改即可运行(这可能涉及您将示例文件附加到您的问题中 - 它不必是真实的客户文件,只是一个证明问题的人)。它必须证明您遇到的问题,并且您的问题必须清楚地详细说明 minimal reproducible example 当前正在做什么 - 以及您希望它做什么。
-
您是否考虑过只打开文件一次(而不是两次,一次读取,一次写入)? stackoverflow.com/questions/33633344/…
标签: c# file io filestream