跑两獗 发表于 2025-6-9 10:50:00

Windows 行为测试 删除 FileStream 正在读写文件可以继续读写

本文在 Win11 系统下,测试使用 FileStream 对文件进行读写,读写过程中,删除正在读写的文件后的行为
测试结论:
使用 FileShare 带 Delete 的共享方式打开的 FileStream 正在对文件进行读写过程中,可以对正在读写的文件进行删除。文件删除之后,不影响已经打开的 FileStream 的读写。且此时使用 File.Exists 方法判断文件是否存在,返回的是不存在
如果删除之后,再次在外部新建同名文件,则原本已经打开的 FileStream 对此同名文件毫无影响
如果对文件进行移动(相同驱动器)或重命名,则原本已经打开的 FileStream 能够作用在移动之后的文件下,即写入时能写入到被移动的文件里而不会在原本的路径下重新新建文件再写入内容
以下是具体测试逻辑:
var filePath = @"F:\temp\FelernihearBechanalwhi";

await using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite,
    FileShare.Delete | FileShare.ReadWrite, bufferSize: 10, FileOptions.WriteThrough);

await using var readStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite, bufferSize: 10, FileOptions.WriteThrough);

for (var i = 0; i < int.MaxValue; i++)
{
    fileStream.Write();
    await fileStream.FlushAsync();
    Console.ReadLine();

    if (i == 3)
    {
      File.Delete(filePath);
    }

    readStream.Position = 0;
    var buffer = new byte;
    var readCount = readStream.Read(buffer, 0, buffer.Length);
    Console.WriteLine($"文件存在: {File.Exists(filePath)} 读取内容: {readCount}");
}

Console.WriteLine("Hello, World!");以上代码先使用 FileShare.Delete 方式打开了 FileStream 进行读写
再进行三次读写之后,删除文件。经过实际运行测试,可以看到控制台输出内容如下
文件存在: True 读取内容: 3

文件存在: True 读取内容: 6

文件存在: True 读取内容: 9

文件存在: False 读取内容: 12

文件存在: False 读取内容: 15通过以上的控制台输出可以看到,使用 File.Exists 确实判断文件不存在了
证明文件确实被删除了,且文件被删除了不影响已打开的 FileStream 的读写
如果大家想要测试移动文件之后的行为,可以自行在资源管理器里面,将文件在同驱动器进行移动或重命名
为什么不能跨驱动器?因为跨驱动器的移动实际上是复制新的和删除原来的,这就不符合实验要求了
为什么行为如此呢?请看 符号链接、硬链接及其在 Windows 上的应用举例 - 少数派
本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 0f361e0d7d984508e8ca19e9414b01074e220516以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 0f361e0d7d984508e8ca19e9414b01074e220516获取代码之后,进入 Workbench/HibairjukegoYekallgera 文件夹,即可获取到源代码
更多技术博客,请参阅 博客导航

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

懵崭 发表于 2025-10-18 00:40:39

不错,里面软件多更新就更好了

宿遘稠 发表于 2025-11-5 20:43:10

过来提前占个楼

史华乐 发表于 2025-11-14 00:57:49

yyds。多谢分享

坏级尹 发表于 2025-12-14 11:17:25

新版吗?好像是停更了吧。

麓吆 发表于 2025-12-25 14:12:32

分享、互助 让互联网精神温暖你我

娄静曼 发表于 2026-1-5 08:54:15

感谢分享,下载保存了,貌似很强大

富账慕 发表于 2026-1-13 20:52:28

懂技术并乐意极积无私分享的人越来越少。珍惜

怒鼓踊 发表于 2026-1-16 17:45:40

前排留名,哈哈哈

支智敏 发表于 2026-1-17 02:00:07

分享、互助 让互联网精神温暖你我

村亢 发表于 2026-1-19 01:36:13

收藏一下   不知道什么时候能用到

蝙俚 发表于 2026-1-20 01:18:20

不错,里面软件多更新就更好了

宁觅波 发表于 2026-1-21 22:07:04

感谢,下载保存了

髭赌 发表于 2026-1-22 23:31:24

鼓励转贴优秀软件安全工具和文档!

剧拧并 发表于 2026-1-23 04:15:12

感谢分享,学习下。

阜逐忍 发表于 2026-2-1 05:53:06

谢谢分享,试用一下

筒霓暄 发表于 2026-2-2 04:10:33

谢谢分享,辛苦了

镝赋洧 发表于 2026-2-6 04:54:18

收藏一下   不知道什么时候能用到

衣旱 发表于 2026-2-9 10:44:36

谢谢分享,试用一下

洪势 发表于 2026-2-9 19:19:59

分享、互助 让互联网精神温暖你我
页: [1] 2
查看完整版本: Windows 行为测试 删除 FileStream 正在读写文件可以继续读写