【问题标题】:.NET Core - Multiple read/write operations on a text file.NET Core - 文本文件上的多个读/写操作
【发布时间】:2022-01-06 18:00:24
【问题描述】:

多个读/写操作是访问单个文件,而在写操作时我遇到了这个问题

The process cannot access the file because it is being used in another process

使用它向文件中添加文本

using (StreamWriter writer=System.IO.File.AppendText("wwwroot/Files/file.txt"))
      {
           writer.WriteLine(stringData.ToString());
           writer.Close();
      }

是否可以对文件执行多次读/写?

谢谢

【问题讨论】:

    标签: c# .net .net-core asp.net-core-webapi .net-core-2.2


    【解决方案1】:

    如果使用来自多个线程的相同代码或写入同一文件的应用程序,您可能会发现当一个线程正在连接时,它会发现该文件已在使用中。 错误信息的唯一原因是文件没有关闭。

    如果写入文件的调用是从同一个应用程序连续调用,则文件没有正确关闭。

    处理此问题的一种方法是检查锁定的文件并稍后重试。 类似这样的东西可以用来检查文件是否打开:

    public static bool CanBeOpenedForExclusiveRead(string filename)
            {
                try
                {
                    // Test file for exclusive read/write
                    using (System.IO.FileStream fileStream = System.IO.File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.None))
                    {
                        fileStream.Close();
                    }
                    return true;
                }
                catch
                {
                }
    
                return false;
            }
    

    如果您已经在使用 NLog 之类的东西,则使用 nlog 将写入“记录”到文件中,nlog 将更好地跨线程处理这些问题。

    【讨论】:

    • 我还在尝试为请求、响应和标头信息添加/创建自定义中间件日志记录,并将这些信息保存在文本文件中。但是由于许多函数会尝试访问同一个文件,这会在读取文件时产生问题。为了查看,我提供了放在 wwwroot 中的文本文件。
    • 读取文件应该不是问题。特定文件的日志记录机制可能比从头开始更好。
    【解决方案2】:

    试试下面的代码。您可能不需要 StreamWriter

            // To append text to file
            System.IO.File.AppendAllText("FilePath", "TextToWrite");
    
            // To read all text from file
            string textFromFile = System.IO.File.ReadAllText("FilePath");
    

    【讨论】:

    • 这里的代码和 OP 发布的代码之间没有实际区别(因为AppendAllText 与 OP 已经拥有的大致相同)...显然,它们没有显示并行读取的部分写,但这似乎是根据标签给出的。解释一下为什么您认为您的代码可以解决所有可能的问题会有所帮助。
    • @AlexeiLevenkov 实际上我正在尝试复制日志记录的功能,添加与函数请求、响应和带有时间戳的标头信息相关的信息。但是对于某些功能列表(大约 15-17 ),并且在读取功能中,我只是在浏览器中访问/提供我放在 wwwroot 文件夹( /logs/mylogs.txt )中的文本文件跨度>
    猜你喜欢
    • 2017-06-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2019-07-21
    • 2016-08-14
    • 2021-04-09
    相关资源
    最近更新 更多