file.delete未能尝试删除打开的文件,但在过程退出时删除



在调用 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打开文件,因此无法删除已使用的文件。但是在内核级别,所有删除均为删除close。

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

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

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

这条线毫无例外地通过后,我们知道该文件在打开它时未使用。当然,它可能会在此行之后立即由其他人打开,但是也许此解决方案对您来说足够。

最新更新