3

在调用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;
    }
}

这里有什么问题吗?

4

1 回答 1

4

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

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

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

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

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

于 2012-11-03T13:39:35.110 回答