fclose 之后文件没有马上更新,是不是没有马上写入磁盘.

时间:2022-06-29 16:02:17
我用TCP传文件,传完之后服务端fclose关闭文件,然后再用stat读取文件大小,返回给客户端.

现在读取到的文件大小老是错的,自己用资源管理器看文件也是,fclose之后文件大小还在慢慢增加,大约要5-10秒左右才能加到正确的大小.

不应该是fclose之后就写入磁盘的吗?

11 个解决方案

#1


补充一下,文件并不大,才27MB.

#2


fwrite以后,再fflush一下就行了。

#3


引用 2 楼 ccrun 的回复:
fwrite以后,再fflush一下就行了。


刚试了一下,每个fwrite之后再fflush , fclose之后马上调用stat,这时文件大小还是不对(返回给客户给的结果还是大小错误),这时候从资源管理器中看文件还是需要等几秒才能慢慢增加到正常的大小.

#4


fwrite每次写入的大小是1K.

#5


我在想 fclose 之后,有没有什么办法可以再判断一下文件是否全部写入到磁盘中了

#6


stat不靠谱吧,换GetFileSizeEx试试

#7


5~10秒,是否缓存的数据多,27M的数据1K的写速度有影响。你是接受完才开始写文件的么?

#8


引用 7 楼 guanchaoyi 的回复:
5~10秒,是否缓存的数据多,27M的数据1K的写速度有影响。你是接受完才开始写文件的么?


不是,接收1K写1K,我现在写完还加了fflush,然后,fclose之后马上读取文件大小,但读出来的不对.

我在正单独写个程序测试一下.

#9


单独写个程序试倒没这个问题了,但是在tcp server的线程上接收写,确实有这个问题.不知道该怎么查了.

#10


可以边传边看下文件的变化,如果文件在传输过程中并没有逐渐增大,那就是还没有写入文件。可以考虑缓存、网络同步等问题。
先可以考虑每接受1K就fclose一下,用来测试,等找到问题原因后,再修正这种写法。

#11


即使有缓存,一个字节都没写进去,stat也不应该有错。
例外是nfs,及直接扇区读写。

#1


补充一下,文件并不大,才27MB.

#2


fwrite以后,再fflush一下就行了。

#3


引用 2 楼 ccrun 的回复:
fwrite以后,再fflush一下就行了。


刚试了一下,每个fwrite之后再fflush , fclose之后马上调用stat,这时文件大小还是不对(返回给客户给的结果还是大小错误),这时候从资源管理器中看文件还是需要等几秒才能慢慢增加到正常的大小.

#4


fwrite每次写入的大小是1K.

#5


我在想 fclose 之后,有没有什么办法可以再判断一下文件是否全部写入到磁盘中了

#6


stat不靠谱吧,换GetFileSizeEx试试

#7


5~10秒,是否缓存的数据多,27M的数据1K的写速度有影响。你是接受完才开始写文件的么?

#8


引用 7 楼 guanchaoyi 的回复:
5~10秒,是否缓存的数据多,27M的数据1K的写速度有影响。你是接受完才开始写文件的么?


不是,接收1K写1K,我现在写完还加了fflush,然后,fclose之后马上读取文件大小,但读出来的不对.

我在正单独写个程序测试一下.

#9


单独写个程序试倒没这个问题了,但是在tcp server的线程上接收写,确实有这个问题.不知道该怎么查了.

#10


可以边传边看下文件的变化,如果文件在传输过程中并没有逐渐增大,那就是还没有写入文件。可以考虑缓存、网络同步等问题。
先可以考虑每接受1K就fclose一下,用来测试,等找到问题原因后,再修正这种写法。

#11


即使有缓存,一个字节都没写进去,stat也不应该有错。
例外是nfs,及直接扇区读写。