File.Delete()在程序完成之前不删除文件

时间:2015-03-29 17:13:12

标签: c# visual-studio-2013

我正在尝试以编程方式删除已损坏的符号链接,并将其替换为具有相同名称的有效目标的链接。但是,当CreateSymbolicLink()执行时,File.Delete()仍然没有实际删除文件(我已经验证文件在File.Delete()执行后仍然存在,没有错误或警告)。

当程序完成执行时,才会实际删除该文件。有没有搞错?这阻止了创建符号链接。任何想法该怎么做?

    private static string replaceSymbolicLink(string linkPath, string newTargetPath)
    {
        Boolean linkIsFile = File.Exists(linkPath);
        Boolean linkIsDir = Directory.Exists(linkPath);

        // Create a replacement of the same name and link type with the new target
        string newTargetPathDOS = getAbsPathFromPath(newTargetPath);
        Boolean targetIsFile = File.Exists(newTargetPathDOS);
        Boolean targetIsDir = Directory.Exists(newTargetPathDOS);
        if (targetIsFile || targetIsDir)
        {
            if (linkIsFile)
            {
                File.Delete(linkPath);
                Console.WriteLine(File.Exists(linkPath));
            }
            else
            {
                Directory.Delete(linkPath);
            }
            SymbolicLink type;
            if (targetIsFile)
            {
                type = SymbolicLink.File;
            }
            else
            {
                type = SymbolicLink.Directory;
            }
            CreateSymbolicLink(linkPath, newTargetPath, type);
            return getGuidFromPath(linkPath);
        }
        return null;
    }

1 个答案:

答案 0 :(得分:4)

在Windows上,删除不是立竿见影的。文件被标记为已删除,并且在关闭最后一个句柄时实际上会消失。通常,此机制不可见,因为大多数文件都是以共享权限打开,以防止删除。这会导致删除失败或立即执行。

FileShare.Delete允许在删除文件(FileStream)时保持打开状态。如果您以前从未听说过这种情况,这可能是令人惊讶的行为。

所以你可能仍然打开文件或其他一些进程。