文件操作不会替换整行

本文关键字:替换 操作 文件 | 更新日期: 2023-09-27 18:34:03

我正在尝试用另一个文件行替换文件行。

这是我的代码块

string text = readWholeFile(fileName);
text = text.Replace(oldLine, newLine);
IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication();
using (var isoFileStream = new IsolatedStorageFileStream(fileName,
    FileMode.OpenOrCreate, FileAccess.Write, myStore))
{
    using (var isoFileWriter = new StreamWriter(isoFileStream))
    {
        isoFileWriter.WriteLine(text);
        isoFileWriter.Close();            
    }
    isoFileStream.Close();

问题是 Line 只替换了换行符的确切数量。例如,如果 OldLine 是 1234567890 而 newLine 是 asd 。文件操作给出如下输出

asd
4567890

这里readWholeFile方法读取整个文件。 和oldLinenewLine是方法字符串参数。

文件操作不会替换整行

这段代码按预期工作:

string text = "1234567890'n1234567891'n1234567892";
var rText = text.Replace("1234567890", "asd");
Console.WriteLine(rText);
Console.ReadKey();

输出为:

asd
1234567891
1234567892

所以,很明显,你的问题不在于 String.Replace 方法。您可以使用简单的代码来"读取整个文件":

string[] text = File.ReadAllLines(filename);
StringBuilder str = new StringBuilder();
foreach (string s in text) 
    str.AppendNewLine(s);

比,

var rText = str.ToString().Replace(oldLine, newLine);

最后,再次将所有内容保存到文件中:

File.WriteAllText(outputFile, rText);

编辑

此外,以下代码有效:

string text = "1234567890'n1234567891'n1234567892";
var rText = text.ToString().Replace("1234567890", "asd");
using (var isoFileStream = new FileStream("output.txt",
       FileMode.Create, FileAccess.Write))
{
    using (var isoFileWriter = new StreamWriter(isoFileStream))
    {
        isoFileWriter.Write(rText);                    
    }
}

正如预期的那样,输出为:

asd
1234567891
1234567892

但我发现以下原因导致了问题:

using (var isoFileStream = new FileStream("output.txt",
       FileMode.OpenOrCreate, FileAccess.Write))
{
    using (var isoFileWriter = new StreamWriter(isoFileStream))
    {
        isoFileWriter.Write(rText);
    }
}

这导致问题的情况是,当文件已存在并具有以下内容时:

1234567890
1234567891
1234567892

文件中的输出为:

asd
1234567891
1234567892
67892

如果将文件模式更改为 File.Create,而不是 File.OpenOrCreate,则问题将消失。

编辑

我没有使用"IsolatedStorageFile",只是因为我没有在SilverLight上下文上进行测试,也没有使用ClickOnce进行部署,因此它不起作用。