用FILESTREAM写向磁盘写文件时,如果文件很大,或是连续性的比方说录音录象,把磁盘写满时该怎么做?

时间:2022-04-14 04:50:30
用FILESTREAM写向磁盘写文件时,如果文件很大,或是连续性的比方说录音录象,把磁盘写满时该怎么做?

21 个解决方案

#1


当文件写到一定大小的时候就重新写新的文件.
所以你的每个文件的大小都是固定的

当写满的时候,你可以删除最开始的文件,或者让用户重新选择磁盘(存取路径)

#2


对,可以用TRY捕获错误,但不知道怎么关闭这个还未写完的文件,一关闭就会报错

#3


该回复被版主删除

#4


怎么出错,要贴代码出来?

#5


filestream fs=new filestream(@"d:\aa.wav",FileMode.Create);
try
{
while(true)
{
   fs.Write(SystemHead, 0, SystemHead.lenth);
}
}
catch
{
   fs.close();
}
当一直写盘,写到磁盘满的时候TRY会捕获到这个异常,但调用close时,JIT会报磁盘空间不足,系统就退出了。
可以不写FS.CLOSE,但文件始终被应用程序站用,无法打开和删除,需要退出应用程序后才能操作,我现在就是不想退出应用程序,而让FS的资源释放又不报错!

#6


真诚高分求解,有兴趣的朋友最好做做这个实验,相信这个问题每个程序员都会遇到的,想办法把它解决好,使你编的程序漏洞更小。

#7


你在写之前,先判断当前硬盘是否有足够大的空间,如果有的话,用字节0先抢占空间,然后再去读文件去覆盖。

#8


判断当前硬盘是否有足够大的空间,参看
http://www.codeproject.com/csharp/logicaldiskinfo.asp

#9


至于用字节0先抢占空间,如下:
byte[] bBuffer = new byte[ yourFileLength ];
yourStreamWriter.Write( bBuffer );

如果文件太大,可以定义固定的长度buffer,然后循环写。

填充完0后,然后用Seek走到文件起始位置进行重新写入真正数据。

#10


十分感谢Knight94(愚翁)的回复,也算一个方法,考虑过此方法,但有几个问题,1,文件大小不确定(因为是取时时的音视频文件流),2,因有多路音视频流频繁同时写盘,每次通过获取硬盘空间大小做判断,太费系统资源,怕影象整个系统的稳定性。

#11


如果不这样的话,你在用Stream去写的话,如果出现硬盘空间不够的话,会有异常。
然后你进行捕获,应该是IOException。

#12


确实捕获的到,但还是无法关闭次FS流,一关就报错

#13


你为什么不在写之前就判断一下呢

#14


我现在在做一个硬盘录象系统,里面数据流都是实时产生的,需要长时间录象,不是简单的文件复制,如用户愿意,他会不停的录象,谁也不知道他要录多大。而且实时获取硬盘大小,耗费系统资源也不小,加入这个判断会很影响效率的。

#15


补捉错误吧

#16


分阶段判断,比如每写一兆,判断一下空间还够1兆否?
如果空间不足,提示用户并关闭
好资源不多

#17


耗资源不多

#18


一般会分时段写成文件,一个小时或半个小时对应一个文件

可以考虑建一个文件管理类,可以管理多个文件
它内部自动去新建文件或者关闭文件,或者更换文件路径
然后你只管用它来读写数据就可以了

#19


先写缓冲,然后定期写入文件,捕获异常的话,就改路径

#20


学习

#21


磁盘满导致写入失败会让文件无法关闭,这个似乎是1.x里面的一个Bug,以前在论坛上讨论过,是因为Close和Dispose方法里面没有屏蔽异常并且还调用非常有可能抛出异常的Flush方法。

#1


当文件写到一定大小的时候就重新写新的文件.
所以你的每个文件的大小都是固定的

当写满的时候,你可以删除最开始的文件,或者让用户重新选择磁盘(存取路径)

#2


对,可以用TRY捕获错误,但不知道怎么关闭这个还未写完的文件,一关闭就会报错

#3


该回复被版主删除

#4


怎么出错,要贴代码出来?

#5


filestream fs=new filestream(@"d:\aa.wav",FileMode.Create);
try
{
while(true)
{
   fs.Write(SystemHead, 0, SystemHead.lenth);
}
}
catch
{
   fs.close();
}
当一直写盘,写到磁盘满的时候TRY会捕获到这个异常,但调用close时,JIT会报磁盘空间不足,系统就退出了。
可以不写FS.CLOSE,但文件始终被应用程序站用,无法打开和删除,需要退出应用程序后才能操作,我现在就是不想退出应用程序,而让FS的资源释放又不报错!

#6


真诚高分求解,有兴趣的朋友最好做做这个实验,相信这个问题每个程序员都会遇到的,想办法把它解决好,使你编的程序漏洞更小。

#7


你在写之前,先判断当前硬盘是否有足够大的空间,如果有的话,用字节0先抢占空间,然后再去读文件去覆盖。

#8


判断当前硬盘是否有足够大的空间,参看
http://www.codeproject.com/csharp/logicaldiskinfo.asp

#9


至于用字节0先抢占空间,如下:
byte[] bBuffer = new byte[ yourFileLength ];
yourStreamWriter.Write( bBuffer );

如果文件太大,可以定义固定的长度buffer,然后循环写。

填充完0后,然后用Seek走到文件起始位置进行重新写入真正数据。

#10


十分感谢Knight94(愚翁)的回复,也算一个方法,考虑过此方法,但有几个问题,1,文件大小不确定(因为是取时时的音视频文件流),2,因有多路音视频流频繁同时写盘,每次通过获取硬盘空间大小做判断,太费系统资源,怕影象整个系统的稳定性。

#11


如果不这样的话,你在用Stream去写的话,如果出现硬盘空间不够的话,会有异常。
然后你进行捕获,应该是IOException。

#12


确实捕获的到,但还是无法关闭次FS流,一关就报错

#13


你为什么不在写之前就判断一下呢

#14


我现在在做一个硬盘录象系统,里面数据流都是实时产生的,需要长时间录象,不是简单的文件复制,如用户愿意,他会不停的录象,谁也不知道他要录多大。而且实时获取硬盘大小,耗费系统资源也不小,加入这个判断会很影响效率的。

#15


补捉错误吧

#16


分阶段判断,比如每写一兆,判断一下空间还够1兆否?
如果空间不足,提示用户并关闭
好资源不多

#17


耗资源不多

#18


一般会分时段写成文件,一个小时或半个小时对应一个文件

可以考虑建一个文件管理类,可以管理多个文件
它内部自动去新建文件或者关闭文件,或者更换文件路径
然后你只管用它来读写数据就可以了

#19


先写缓冲,然后定期写入文件,捕获异常的话,就改路径

#20


学习

#21


磁盘满导致写入失败会让文件无法关闭,这个似乎是1.x里面的一个Bug,以前在论坛上讨论过,是因为Close和Dispose方法里面没有屏蔽异常并且还调用非常有可能抛出异常的Flush方法。