删除StreamWriter的最后一行?

时间:2011-12-13 10:49:29

标签: c# streamwriter

我知道当我们使用StreamWriter时,根据定义,这是写入的,但事实是,在某些时候我有义务删除我的streamwriter的最后一行......

我发现以下代码(在SO上)效果很好:

var lines = System.IO.File.ReadAllLines(pluginQmlFileName);
System.IO.File.WriteAllLines(pluginQmlFileName, lines.Take(lines.Length - 1).ToArray());

但问题是我无法在我的使用中使用它:

using (StreamWriter sw = new StreamWriter(pluginQmlFileName, true))
{
    [...]
}

部分。

有没有办法删除using {}部分的最后一行,还是必须保留我的实际代码?

6 个答案:

答案 0 :(得分:4)

我不认为StreamWriter允许你这样做,但也许你可以制作自己的流包装器来实现这种行为?也就是说,它会将最后一行保留在内存中,只有在另一行进入时才写出来。

答案 1 :(得分:3)

您可以在读完所有内容后删除最后一行:

var lines = System.IO.File.ReadLines(pluginQmlFileName);

// will need changing to remove from the array if using ReadAllLines instead of ReadLines
lines = lines.RemoveAt(lines.Count - 1);

答案 2 :(得分:1)

否则您无法从StreamWriter打开的流中删除任何数据。 StreamWriter旨在写入文件,因此您无法显式删除任何内容。

所以必须使用其他类来读取文件内容,然后从StreamWriter class继承TextWriter class,你应该可以使用WriteLine(string)方法,但这样做没有意义已经有一个非常好的工作代码。

// read all lines
// ...
var allExceptLast = lines.Take(lines.Length - 1);
foreach(var line in allExceptLast)
{
   writer.WriteLine(line);
}

答案 3 :(得分:1)

这似乎与我合作:

//你必须尝试关闭该文件的所有打开流(如果有的话) //如果你在using (StreamWriter sw = .... ) {....}内使用它 // attempt => sw.close(); //然后

FileStream fs = new FileStream(filePath , FileMode.Open, FileAccess.ReadWrite);
fs.SetLength(fs.Length - 1);
fs.Close();

答案 4 :(得分:0)

好吧,在上面的代码中,lines实际上是一个字符串数组,因为ReadAllLines返回一个字符串数组。

我没有考虑“删除最后一行”,而是考虑“不写最后一行”,所以你能做什么:

string[] lines = ...; // Note that I'm using an array here!

using (...)
{
    for (int i = 0; i < lines.Length; i++)
    {
        if (i < lines.Length-1 || !condition)
            sw.WriteLine(lines[i]);
    }
}

这会将所有行写到最后一行。仅当条件为假时才写入最后一行。

答案 5 :(得分:0)

这就是我要解决的问题:

StreamWriter myFile = new StreamWriter(fileName, false);
int countLines = 0;
foreach (var line in lines)
{
    countLines++;
    if (countLines == lines.Count)
    {
        //Write doesn't insert "/r/n" on the end of line
        myFile.Write(line.ToString());
    }
    else
    {
        //WriteLine insert "/r/n" on the end of a line
        myFile.WriteLine(line.ToString());
    }
}