文件操作不会替换整行

时间:2014-12-11 18:14:43

标签: c# .net io

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

这是我的代码块

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只替换了newLine字符的确切数量。例如,如果OldLine是1234567890而newLine是asd。文件操作给出类似这样的输出

asd
4567890

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

1 个答案:

答案 0 :(得分:1)

这段代码按预期工作:

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.OpenOrCreate而是将文件模式更改为File.Create,则问题将消失。

修改

我之前没有使用过“IsolatedStorageFile”,因为我没有在SilverLight上下文测试,也没有使用ClickOnce进行部署,因此无法使用