在为在另一个进程中打开的文件调用 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/