【问题标题】:Overwrite an file which is currently open and it use in c#覆盖当前打开并在 c# 中使用的文件
【发布时间】:2019-05-06 02:59:37
【问题描述】:

我正在使用 C# 创建一个具有日志记录功能的 GUI。当我创建日志文件时,我为其提供了一个文件名。但我有以下问题。例如,如果文件已经在我的桌面后台打开并且我想将我的文件名命名为相同,我会收到如下异常消息:

The process cannot access the file 'C:\blah\blah\mytest.csv' because it is being used by another process.

我正在使用以下代码检查文件是否存在并使用流写入器创建新文件。

if (FileUtils.Exists(fileName))
            {
                if (!FileUtils.Delete(fileName))
                {
                    cout<< Error replacing log file, it might be used by another process"; 
                }             
            }

//Exception handling
     public static bool Delete(string myfiletowrite)
            {
                try
                {
                    File.Delete(myfiletowrite);
                    return true;
                }
                catch (IOException)
                {
                    return false;
                }
            } 
myfile= new StreamWriter(myfiletowrite, true); //exception occurs here when I try to write to myfiletowrite which is currently open 

我不确定如何关闭这个在后台打开的文件,以便我可以写入这个文件。如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

  • 你不能。您必须终止打开文件的后台进程。
  • @500-InternalServerError 我使用 C# 工具中的日志功能创建了该文件。然后我想创建另一个日志文件,但名称相同,并且该文件当前处于打开状态。有没有办法在代码中处理这个?
  • 如果操作系统提供了一种机制允许您强制覆盖其他人打开的文件,那将是非常糟糕的。最好的办法是尝试打开所需的文件,如果失败,请使用不同的文件名重试。例如附加一个时间戳。
  • @Analia 为什么要在同一个程序中打开同一个文件两次?这不是一个好的设计。
  • @TypeIA 创建日志文件名时,我给它起了相同的名称,看看我的代码是否可以处理它。但它会与 myfile 发生冲突。这就是为什么我想在代码中处理它,比如关闭文件然后创建它。

标签: c# file overwrite


【解决方案1】:

如果其他应用程序没有明确允许(通过共享模式),则无法打开文件进行写入。

如果其他应用程序在您的控制之下,您有一些选择(使用FileShare.Write 打开文件,在两个应用程序之间实现一些通信协议,使用公共服务访问文件,...)。

最好的选择是选择不同的文件名。

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2011-08-04
    • 2017-04-10
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多