关于Flush的问题

gs0038 2020-11-30 05:34:18

Flush摘要描述:清理当前编写器的所有缓冲区,使所有缓冲数据写入基础设备。

在文件流写完最后执行Flush,但是在我在电脑上的文件大小并没有增加呢,还是0个字节为什么呢,
不是说使所有缓冲数据写入基础设备吗,它写到哪里去了

直到我执行Close之后文件大小才显示出来,如果这样子,我是不是直接写Close就可以了呢

经过测试确实不执行Flush,直接执行Close也可以把数据写到文件里面去;


那在什么情况下要用到Flush呢,它讲的写到基础设备,是写到哪里了呢
...全文
5701 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
按道理说,其实你的程序每一次调用 Write 时都可以调用一次 Flush,或者是你干脆根本不调用 Flush,这其实是更大逻辑问题。例如对于 NetworkStream 而言其实是对方是否更早地、但是也更细碎地启动 Receice 的问题。仅仅看正确性,可能也没有什么差别。对于 windows 10 你从文件管理器窗口来判断“Flush被调用时文件是否写入了新数据”这个做法本身不可靠,人家完全可以在(独占的)文件关闭这个事件发生时才去刷新那么文件管理器程序的界面。你应该去直接获取文件大小,甚至去获取 windows磁盘驱动的内部数据,才能的断言说数据有没有落地。
  • 打赏
  • 举报
回复
“所有缓冲数据写入基础设备”不算是骗人的,但是对于 windows 10这么复杂的系统,一个“语言级别”的 Flush 并不能决定了操作系统底层的一切。如果你往一个 NetworkStream 执行 Flush 你肯定会看得到对方立刻收到了“全部写入数据”,而 windows 的文件管理器界面是否及时刷新显示的问题,则没有这么简单。
wanghui0380 2020-12-01
  • 打赏
  • 举报
回复
嘿嘿,摔死的都是有路不走,非要跳的
wanghui0380 2020-12-01
  • 打赏
  • 举报
回复
写还是需要时间的,实际上你说的一点没错。因为那个园子特别喜欢跟你纠结这些名词和术语。所以你们也喜欢纠结名词和术语 实际正常,自然而然的写法是 using(filestream) 他会自然而然调用flush和close,所以如果你是正常写,这部分你是可以不用管 至于有些人强调flush,那是一些特殊情况,前面说写和缓存都需要一点时间,而特别纠结于我就是要3ms内看到他在显示,他在增长,那就2ms 去flush一次 但是,还是但是。我们说你只需记得特殊情况有这么个东西就好,不必如那园子一样,非要“不走寻常路”,估计专挑房角屋檐玩极限运动
gs0038 2020-12-01
  • 打赏
  • 举报
回复
引用 2 楼 lorimoon 的回复:
在一般情况下的程序写数据是将先写内存(数据库就是反过来的),再写硬盘,你可以认为flush 是将未写到硬盘的数据写到硬盘,然后将内存标志为空闲/干净,状态。
感觉回复,但是执行flush之后,电脑上的文件还是0的,如果是真的写到硬盘上,电脑上的文件不应该有大小才对的吗,
gs0038 2020-12-01
  • 打赏
  • 举报
回复
引用 8 楼 生财 的回复:
Flush 可以有效的提高写入性能,当写入一个较大的文件时需要经过多次写入,如果长时间不flush可能会导致过多的内容在内存中程序内存占用过高,调用Flush可以即时写入到文件中. 当然最明显的是写入100万条记录时不要频繁的flush 可以 定时Flush,最后再flush,然后再释放资源
C# 使用的文件流默认的缓冲区是4K,即使用不调用Flush,缓冲区也会自己刷新,有效的提高性能,它靠的是缓冲区,想提高性能只要提高缓冲区,它不是执行多几次Flush有关;我的问题并不是提高不提高性能,我只是想搞明白 调用Flush 为什么电脑上的文件还没有写入,直到执行Close之后才会有数据,微软给我们的描术清理当前编写器的所有缓冲区,使所有缓冲数据写入基础设备是不是骗人的
生财 2020-12-01
  • 打赏
  • 举报
回复
Flush 可以有效的提高写入性能,当写入一个较大的文件时需要经过多次写入,如果长时间不flush可能会导致过多的内容在内存中程序内存占用过高,调用Flush可以即时写入到文件中. 当然最明显的是写入100万条记录时不要频繁的flush 可以 定时Flush,最后再flush,然后再释放资源
  • 打赏
  • 举报
回复
引用 4 楼 wanghui0380 的回复:
写还是需要时间的,实际上你说的一点没错。因为那个园子特别喜欢跟你纠结这些名词和术语。所以你们也喜欢纠结名词和术语 实际正常,自然而然的写法是 using(filestream) 他会自然而然调用flush和close,所以如果你是正常写,这部分你是可以不用管 至于有些人强调flush,那是一些特殊情况,前面说写和缓存都需要一点时间,而特别纠结于我就是要3ms内看到他在显示,他在增长,那就2ms 去flush一次 但是,还是但是。我们说你只需记得特殊情况有这么个东西就好,不必如那园子一样,非要“不走寻常路”,估计专挑房角屋檐玩极限运动
大佬,你和园子有仇啊。 using(filestream) 是自动清理了。 没有using 要手动写。 但是我习惯了 filestream.flush filestream.close 我也不知道flush干什么用的, 有的时候就是书读的太少。 就为了完成功能,没去研究没一句代码的具体意义
gs0038 2020-12-01
  • 打赏
  • 举报
回复
引用 4 楼 wanghui0380 的回复:
写还是需要时间的,实际上你说的一点没错。因为那个园子特别喜欢跟你纠结这些名词和术语。所以你们也喜欢纠结名词和术语 实际正常,自然而然的写法是 using(filestream) 他会自然而然调用flush和close,所以如果你是正常写,这部分你是可以不用管 至于有些人强调flush,那是一些特殊情况,前面说写和缓存都需要一点时间,而特别纠结于我就是要3ms内看到他在显示,他在增长,那就2ms 去flush一次 但是,还是但是。我们说你只需记得特殊情况有这么个东西就好,不必如那园子一样,非要“不走寻常路”,估计专挑房角屋檐玩极限运动
有时候就是想不close这文件,要一直打开,一直重复的写一段数据进去,然后把它保存到文件,这样子其它软件可以读到它,写完后Seek 从头我再写,不想关掉再打开,原本我以为flush之后,文件就会有数据,实际上是只要我不close,文件是不会有数据的
lorimoon 2020-11-30
  • 打赏
  • 举报
回复
在一般情况下的程序写数据是将先写内存(数据库就是反过来的),再写硬盘,你可以认为flush 是将未写到硬盘的数据写到硬盘,然后将内存标志为空闲/干净,状态。
lorimoon 2020-11-30
  • 打赏
  • 举报
回复
硬盘,光盘等一堆可将数据记住的东西。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧