【问题标题】:How to skip files that are in use by another process during programmatic deletion?如何在程序删除期间跳过另一个进程正在使用的文件?
【发布时间】:2020-05-27 16:49:34
【问题描述】:

我正在尝试编写一个自动从特定文件夹中删除文件的 Windows 服务。但是我遇到了一个错误:

无法访问该文件。该文件当前正被另一个进程/程序使用。

我尝试执行以下操作,但仍然遇到相同的错误。

string[] files = Directory.GetFiles(@"C:\Users\ASIM\AppData\Local\Temp");

//  string[] directories = Directory.GetDirectories(@"C:\Users\ASIM\AppData\Local\Temp", "p*", SearchOption.TopDirectoryOnly);

if (files != null || files.Length != 0)
{
   
    {
        foreach (string f in files)
        {
            try
            {
                File.Delete(f);
            }
            finally { }
        }
    }
  
}

那么如何跳过删除正在使用的文件?

【问题讨论】:

  • 这能回答你的问题吗? Is there a way to check if a file is in use?
  • 通过@CameronTinker 的链接,似乎你真正应该做的就是在你的try/finally 中添加一个catch 块。捕获特定的异常类型 (IOException?) 并继续前进似乎是您最好的选择。
  • 服务是否以用户“ASIM”的身份运行?该服务是否有权删除 ASIM 的临时文件?
  • 是的,没有使用的文件会被删除。这与权限无关。

标签: c# .net-core


【解决方案1】:

在删除文件之前检查文件是否可删除是没有意义的,因为在检查和删除之间会有一个小的机会窗口,另一个进程将打开该文件。最好的办法是尝试删除它并在发生异常时处理它。

你的 try/finally 应该是 try/catch 并带有适当的异常:

try
{
   File.Delete(f);
}
catch(IOException ex)
{
   // Probably some logging here 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多