Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件.Delete在尝试删除打开的文件时失败,但在进程退出时删除?_C#_.net - Fatal编程技术网

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上,文件“消失”,仅可由以前的打开程序访问。因此,我无法解释文件删除后的
。尝试删除后,任何其他操作都无法访问路径
问题的一部分。是的,打开一个小窗口后,这似乎解决了我的问题。仍然在寻找无法访问路径问题的解决方案,因为我需要访问路径。有没有办法强制删除“已删除标记”文件的父目录?那可以解决我的问题。或者可以重新创建相同的路径?