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

标签 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;
    }
}

这里有什么问题吗?

最佳答案

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

可能有一种方法可以通过调用 NtSetInformationFile 来设置 FileDispositionInfo 类来清除删除标志。这假定可以清除删除标志。很可能是。

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

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

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

关于c# - File.Delete 尝试删除打开的文件失败但在进程退出时删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13208690/

相关文章:

c# - 我只有 Tibco.EMS.dll,我还需要什么?

.net - Excel 数据导出修复数字错误/删除绿色三角形

c# - 如果选择列表项,则实现 CanExecute 以启用按钮

c# - 如何使用 LINQ 将多级元组列表拆分为多级值列表?

c# - 如何在 Visual Studio 中开发独特的 GUI?

c# - c#中没有变量的拉丁名称

c# - 委托(delegate)指向什么?

c# - 如何在 C# 代码中创建 ImageBrush

c# - 为什么 "dynamic"需要特定于语言的运行时组件?

c# - 如何在 .Net 中修改 tiff 创建日期