File.Delete尝试删除已打开的文件但在进程退出时删除失败?

时间:2012-11-03 11:23:12

标签: c# .net

在为另一个进程中打开的文件调用File.Delete(file_path)时,尝试失败并且无法访问错误,但在退出应用程序时(从中尝试),文件会自动删除。尝试File.Delete后,路径将无法访问任何其他操作。

我需要在删除时失败并让路径可以通过应用程序访问或完全删除文件,而不是在应用程序退出时。

我的代码就是这样:

 private bool DeleteFilesAsync(string FileToDelete)
 {
    try
    {
            //Set file's attribute to normal if it is ReadOnly file
            File.SetAttributes(FileToDelete, FileAttributes.Normal);

            File.Delete(FileToDelete);
           //Some bussiness logic to update file's status in database

        return true;
    }
    catch (Exception ex)
    {
        //log the error
         return false;
    }
}

这里有什么问题?

1 个答案:

答案 0 :(得分:4)

Windows确实有一个删除最后关闭功能。所有删除都以这种方式处理。在实践中几乎从未发生这种情况的唯一原因是因为大多数应用程序不会使用FILE_SHARE_DELETE打开文件,因此无法删除已使用的文件。但在内核级别,所有删除都是关闭时删除。

可能有办法通过调用NtSetInformationFile来设置FileDispositionInfo类来清除删除标志。这假设可以清除删除标志。它可能是。

无论如何,更合理的方法是在删除文件之前打开文件以确保可以使用独占访问:

using(new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { }

此行无异常通过后,我们知道该文件在打开时未使用。当然,它可能会在此行之后立即由其他人打开,但也许这个解决方案对您来说已经足够了。