【问题标题】:File.Move issue: Process cannot access the file exceptionFile.Move 问题:进程无法访问文件异常
【发布时间】:2017-07-02 10:31:22
【问题描述】:

运行此 newFile 方法时出现错误:

class logFile
{
    public static string logpath = @"D:\Program Files\CustomApps\DataFeed\";

    public static void log(string log)
    {
        string timestamp = DateTime.Now.ToString("yyyy_MM_ddTHH_mm_ss");
        Console.WriteLine(timestamp + log);
        File.AppendAllText(logpath + @"log_file_current.txt", timestamp + log + Environment.NewLine);
    }

    public static void newFile()
    {
        if (File.Exists(logpath + @"log_file_current.txt") == true)
        {
            File.Move(logpath + @"log_file_current.txt"
                    , logpath + @"log_files\log_file_ORPHANED_" + DateTime.Now.ToString("yyyy_MM_ddTHH_mm_ss") + ".txt");
        }

        try
        {
            File.Create(logpath + @"log_file_current.txt");
            logFile.log("logFile created.");
        }
        catch(System.NotSupportedException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

我收到以下错误:

如果我将“newFile”代码的主体注释掉,那么它运行时不会出错,但是我需要手动存档。如果我注释掉 File.Move 部分,一切运行良好,所以这是罪魁祸首。

如何释放文件以便移动它?

【问题讨论】:

  • 这显然是一个文件锁定问题,因为你试图调用“log”和“newFile”方法。因此,请解释您要使用“newFile”方法实现的目标。如果您需要归档属于“上一个日期”的日志,您需要有一个机制来检查当前日期和上一个日期之间的差异。
  • 您正在处理很多与错误无关的内容。太好了……谢谢?
  • 但是说真的,反对票是怎么回事?我编写了自己的代码,并明确说明了我的问题。这完全是 SO 的用途。如果我知道 c#,我就不会在这里了。

标签: c#


【解决方案1】:

您需要在使用 File.Create 后使用 File.Close,这就是为什么您会收到错误消息,指出文件已被另一个进程使用。尝试将此行添加到您的代码中:

try
{
    File.Create(logpath + @"log_file_current.txt").Close(); // Notice the .Close() here
    logFile.log("logFile created.");
}

来源: Closing a file after File.Create

【讨论】:

  • 这可能会解决问题。您还可以将 File.Create() 包装在 using 中。问题是 File.Create() 调用在文件上创建了一个锁(它返回一个 FileStream),然后你调用 logFile.log 试图再次打开它。您可以在堆栈跟踪中看到这一点。
  • 谢谢,成功了。这是我的第一个 c#,所以我正在学习。
  • 很高兴能帮上忙!
【解决方案2】:

试试这个

  public static void log(string log)
  {
    string timestamp = DateTime.Now.ToString("yyyy_MM_ddTHH_mm_ss") + ": ";
    Console.WriteLine(timestamp + log);
    using (StreamWriter sw = File.AppendText(logpath + @"log_file_current.txt")) 
    {
        sw.WriteLine(timestamp + log);
    }
  }

【讨论】:

  • 这不是出错的部分。正如我在帖子中所说,崩溃的是 File.Move 部分。
猜你喜欢
  • 1970-01-01
  • 2013-03-26
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多