C# 文件.Delete在尝试删除打开的文件时失败,但在进程退出时删除?
对在另一个进程中打开的文件调用C# 文件.Delete在尝试删除打开的文件时失败,但在进程退出时删除?,c#,.net,C#,.net,对在另一个进程中打开的文件调用File.Delete(File\u path)时,尝试失败,出现“无法访问”错误,但退出应用程序(从尝试的位置)时,文件会自动删除。尝试File.Delete后,任何其他操作都无法访问路径 我需要要么删除失败,让路径可以通过应用程序访问,要么完全删除文件,而不是在应用程序退出时 我的代码是: private bool DeleteFilesAsync(string FileToDelete) { try { //Set
File.Delete(File\u 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确实有上次关闭时删除功能。所有的删除都是这样处理的。在实践中几乎从未出现这种情况的唯一原因是,大多数应用程序都不使用
文件共享\u删除
打开文件,因此无法删除使用过的文件。但在内核级别,所有删除都是在关闭时删除的
可以通过调用NtSetInformationFile
来设置FileDispositionInfo
类来清除delete标志。这假定可以清除删除标志。很可能是这样
无论如何,一种更明智的方法是在删除文件之前打开该文件,以确保独占访问可用:
using(new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { }
在这一行毫无例外地通过之后,我们知道该文件在打开时未被使用。当然,它可能会在这一行之后立即被其他人打开,但也许这个解决方案对您来说已经足够了。我非常确定
File.Delete()
不会延迟在失败时删除文件(Windows也不会遵循UNIX的上次关闭时删除模式)。您确定删除不会因为您自己的代码而延迟吗?发布您删除文件的代码,这里肯定有人可以帮助您。@FrédéricHamidi Windows确实有“上次关闭时删除”功能。所有的删除都是这样处理的!在实践中几乎从未出现这种情况的唯一原因是,大多数应用程序不会使用文件共享和删除打开文件,因此无法删除已使用的文件。但在内核级别,所有删除都是关闭删除。因此,可能依赖于哪个应用程序打开了文件,在我的情况下,有时文件会被打开到应用程序内部的wpf媒体播放器中。如果delete命令失败,有没有办法取消它。原因是,我需要访问该路径以在其上创建新文件,但这不允许?@usr同意,这对我来说过于简单了。不过,行为仍然不同,因为在Windows上,已删除的文件在其最后一个句柄关闭之前保持可访问状态,但在*NIX上,文件“消失”,仅可由以前的打开程序访问。因此,我无法解释文件删除后的。尝试删除后,任何其他操作都无法访问路径
问题的一部分。是的,打开一个小窗口后,这似乎解决了我的问题。仍然在寻找无法访问路径问题的解决方案,因为我需要访问路径。有没有办法强制删除“已删除标记”文件的父目录?那可以解决我的问题。或者可以重新创建相同的路径?