gpt4 book ai didi

c# - 使用 FileShare.Delete 打开已删除文件的行为是否在 Windows 上发生了变化?

转载 作者:行者123 更新时间:2023-12-03 11:05:23 26 4
gpt4 key购买 nike

多年来,我们一直在使用以下代码。

    /// <summary>
/// Opens a file and returns an exclusive handle. The file is deleted as soon as the handle is released.
/// </summary>
/// <param name="path">The name of the file to create</param>
/// <returns>A FileStream backed by an exclusive handle</returns>
/// <remarks>If another process attempts to open this file, they will recieve an UnauthorizedAccessException</remarks>
public static System.IO.FileStream OpenAsLock(string path)
{
var stream = TranslateIOExceptions(() => System.IO.File.Open(path, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write, System.IO.FileShare.Delete));
System.IO.File.Delete(path);
return stream;
}

从内存中,此代码用于在 FileStream 关​​闭之前保留文件。该技术被用作协作并发锁的一部分。

我发现了许多其他问题,这些问题让我认为以前的行为就像评论所描述的那样:文件保持原位,直到返回的文件流关闭。

Will we ever be able to delete an open file in Windows?

Can using FileShare.Delete cause a UnauthorizedAccessException?

但是,作为调查的一部分,我发现 Windows 的行为并非如此。而是在调用 File.Delete 后立即删除该文件。我还尝试重现 Hans 建议的错误,但没有成功。
class Program
{
static void Main(string[] args)
{
File.Open("test", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Delete);
File.Delete("test");
File.WriteAllText("test", "hello world");
Console.Write(File.ReadAllText("test"));
Console.ReadLine();
}
}

不幸的是,我们的单元测试可能已经捕捉到了这种行为变化,但没有正确配置为在我们的环境中每晚运行,所以我不能确定它是否曾经运行过绿色。

这是行为上的真正改变吗?我们知道它是什么时候发生的吗?是故意的(记录在案)吗?

最佳答案

非常感谢 Eryk 的提示。

事实证明,我们确实有几个单元测试可以捕捉到这种行为变化,包括明确测试这种行为的测试。我怀疑这些是在最初调查这种奇怪行为时添加的。

单元测试还没有发出警报,因为我们的测试机器运行的是比我的开发机器更旧的 Windows 10 版本。

  • Build 17134.1304 肯定有旧的行为。
  • Build 18363.657 肯定有新的行为。

  • 我查看了 list of build releases不幸的是,这两个版本之间有超过两打版本。但是,我非常怀疑 build 17763.832, available Oct 15, 2019 中列出的这个“改进和修复”。

    Addresses an issue in which files that are stored in a Cluster Shared Volume (CSV) with an alternate data stream are still present after you try to delete them. You may also receive an "access is denied" message on the next try to access or delete the files.



    我不确定为什么特定于 CSV 的更改会影响我的系统,但描述与我看到的更改完全匹配。

    关于具体的代码,原来我们的代码中从未使用过 return "FileStream"。相反,我们依赖 IDisposable 接口(interface),在“关键部分”完成时关闭流,并解锁共享文件。

    从技术上讲,这是一个重大变化,我现在执行以下操作:
  • 创建具有独占句柄的锁定文件
  • 返回实现 IDisposable
  • 的新对象
  • 等到一次性对象被处理掉,然后关闭流和试试删除文件
  • // ...
    public static IDisposable OpenAsLock(string path)
    {
    var stream = TranslateIOExceptions(() => System.IO.File.Open(path, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write, System.IO.FileShare.None));
    return new FileBasedLock(stream, path);
    }
    // ...

    internal class FileBasedLock : IDisposable
    {
    public FileBasedLock(FileStream stream, string path)
    {
    Stream = stream ?? throw new System.ArgumentNullException(nameof(stream));
    Path = path ?? throw new System.ArgumentNullException(nameof(path));
    }

    public FileStream Stream { get; }
    public string Path { get; }
    public void Dispose()
    {
    Stream.Close();
    try { File.Delete(Path); }
    catch (IOException) { }
    }
    }

    关于c# - 使用 FileShare.Delete 打开已删除文件的行为是否在 Windows 上发生了变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60424732/

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