foreach 中的 Filestream 文件和 Streamwriter 并在完成后添加行

Filestream file and Streamwriter in foreach and add line when done

就像现在我正在尝试使用 FileStream 打开我的文件,与每次通过 Streamwriter 将其写入文件相比,我在代码中看到了更进一步的代码以使用 Streamwriter。

当它 运行 第一次通过时,然后毫无问题地进行,但是一旦我 运行 它通过第二圈。然后它失败然后写入“Stream 不可写

int count = 0;
using (FileStream fs = new FileStream(@"C:\jpe\Projekt\Utilities\Icons\Icons/WriteLines.txt", FileMode.Append, FileAccess.Write))
{
    foreach (SPSite tmpSite in tmpRootColl)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(string.Format("Title {0}", tmpSite.RootWeb.Title));
        //Enumerate through each sub-site
        foreach (SPWeb tmpWeb in tmpSite.AllWebs)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine(string.Format("Title {0}", tmpWeb.Title));
            //Enumerate through each List
            foreach (SPList tmpList in tmpWeb.Lists)
            {
                if (tmpList.BaseTemplate == SPListTemplateType.DocumentLibrary)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine(string.Format("Title {0}", tmpList.Title));
                    using (StreamWriter outputFile = new StreamWriter(fs)) //Errors come here when it runs the second round through.
                    {
                        await outputFile.WriteLineAsync($"{tmpSite.RootWeb.Title} - {tmpList.Title} {count}");
                    }
                    count++;
                }
            }
        }
        Console.WriteLine("__________________________________________________");
    }
}

我想用它实现的是,每次通过 StreamWriter 运行 时,它都必须将文本插入到文件中。应该不是先到最后才完成的。

我已阅读:

C# how to update file(leave old data)

假设您至少使用 .NET Framework 4.5。

StreamWriter 在其 Dispose() 方法中关闭基本流。您可以使用另一个构造函数来调整该行为:https://docs.microsoft.com/en-us/dotnet/api/system.io.streamwriter.-ctor?view=netcore-3.1#system-io-streamwriter-ctor(system-io-stream-system-text-encoding-system-int32-system-boolean)

目前您正在创建一个 StreamWriter,写入它,并为每个列表处理它,这就是导致问题的原因。 Dispose 方法在内部关闭导致异常的基础流。为了解决这个问题,我们可以做两件事之一

  1. 告诉我们的 StreamWriter 不要关闭底层流。
  2. 在我们也完成基础流之前,不要释放我们的 StreamWriter

#1 的操作方法如下:

用这个

简单地替换你对构造函数的调用
using (StreamWriter outputFile = new StreamWriter(fs, leaveOpen: true))

#2 的操作方法如下:

using (StreamWriter ... 块向上移动到比 using (FileStream ... 块“更深一层”

using (FileStream fs = new FileStream("..."))
{
    using (StreamWriter outputFile = new StreamWriter(fs))
    {
        // Your foreach loops here
    }
}

就我个人而言,我会选择 #2,因为我不喜欢在循环中创建和处理对象