gpt4 book ai didi

c# - File.Exists 在 File.Delete 之后返回 true

转载 作者:行者123 更新时间:2023-11-30 20:16:12 26 4
gpt4 key购买 nike

我有以下方法来删除具有提供路径的文件

private void DestroyFile(string path)
{
try
{
if (File.Exists(path))
{
File.Delete(path);
}
if (File.Exists(path))
{
throw new IOException(string.Format("Failed to delete file: '{0}'.", path));
}
}
catch (Exception ex)
{
throw ex;
}
}

如果文件在 File.Delete 方法之后存在,我将得到抛出的 IOException。具体

System.IO.IOException): Failed to delete file: 'C:\Windows\TEMP\[FILE NAME]'.

我也已经确认执行完成后路径变量中的位置不存在该文件。我想知道我是否在 File.Delete 之后更新文件系统和使用 File.Exists 再次检查它之间遇到竞争条件。有没有更好的方法可以顺利删除?我知道如果文件不存在,File.Delete 不会返回错误,所以这些检查可能有点多余。我应该检查文件是否正在使用,而不是检查文件是否存在?

一些重要的附加信息:该程序可以而且确实经常成功运行,但最近经常看到此特定错误。

最佳答案

File.Delete标记 文件删除。只有当所有句柄都关闭时,文件才会真正被删除(如果没有这样的句柄 - 它总是在 File.Delete 返回后被删除)。如 DeleteFile 的记录winapi 函数(由 C# File.Delete 使用):

The DeleteFile function marks a file for deletion on close. Therefore, the file deletion does not occur until the last handle to the file is closed

通常您删除的文件没有打开的句柄。或者,如果有打开的句柄 - 它们通常没有“删除”共享(此共享允许另一个进程将文件标记为删除),因此当您尝试删除此类文件时 - 它要么被删除(没有打开的句柄)要么access denied or similar exception are throwed (some handles, but without delete share).

但是,有时某些软件(例如防病毒软件或搜索索引器)可能会打开带有“删除”共享的任意文件并将它们保留一段时间。如果您尝试删除此类文件 - 它不会出错,并且当该软件关闭其句柄时,文件真的会被删除。但是,File.Exists 将为此类“待删除”文件返回 true。

您可以使用这个简单的程序重现此问题:

public class Program {
public static void Main() {
string path = @"G:\tmp\so\tmp.file";
// create file with delete share and don't close handle
var file = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete);
DestroyFile(path);
GC.KeepAlive(file);
}

private static void DestroyFile(string path) {
try {

if (File.Exists(path)) {
// no error
File.Delete(path);
}
// but still exists
if (File.Exists(path)) {
throw new IOException(string.Format("Failed to delete file: '{0}'.", path));
}
}
catch (Exception ex) {
throw ex;
}
}
}

您可以在上面的程序中重试 File.Exists 永远检查 - 文件将存在直到您关闭句柄。

这就是您的情况 - 某些程序使用 FileShare.Delete 打开了该文件的句柄。

你应该预料到这样的情况。例如 - 只需删除 File.Exists 检查,因为您将文件标记为删除,并且它无论如何都会被删除。

关于c# - File.Exists 在 File.Delete 之后返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50295265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com