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的资源释放又不报错!
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
http://www.codeproject.com/csharp/logicaldiskinfo.asp
#9
至于用字节0先抢占空间,如下:
byte[] bBuffer = new byte[ yourFileLength ];
yourStreamWriter.Write( bBuffer );
如果文件太大,可以定义固定的长度buffer,然后循环写。
填充完0后,然后用Seek走到文件起始位置进行重新写入真正数据。
byte[] bBuffer = new byte[ yourFileLength ];
yourStreamWriter.Write( bBuffer );
如果文件太大,可以定义固定的长度buffer,然后循环写。
填充完0后,然后用Seek走到文件起始位置进行重新写入真正数据。
#10
十分感谢Knight94(愚翁)的回复,也算一个方法,考虑过此方法,但有几个问题,1,文件大小不确定(因为是取时时的音视频文件流),2,因有多路音视频流频繁同时写盘,每次通过获取硬盘空间大小做判断,太费系统资源,怕影象整个系统的稳定性。
#11
如果不这样的话,你在用Stream去写的话,如果出现硬盘空间不够的话,会有异常。
然后你进行捕获,应该是IOException。
然后你进行捕获,应该是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的资源释放又不报错!
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
http://www.codeproject.com/csharp/logicaldiskinfo.asp
#9
至于用字节0先抢占空间,如下:
byte[] bBuffer = new byte[ yourFileLength ];
yourStreamWriter.Write( bBuffer );
如果文件太大,可以定义固定的长度buffer,然后循环写。
填充完0后,然后用Seek走到文件起始位置进行重新写入真正数据。
byte[] bBuffer = new byte[ yourFileLength ];
yourStreamWriter.Write( bBuffer );
如果文件太大,可以定义固定的长度buffer,然后循环写。
填充完0后,然后用Seek走到文件起始位置进行重新写入真正数据。
#10
十分感谢Knight94(愚翁)的回复,也算一个方法,考虑过此方法,但有几个问题,1,文件大小不确定(因为是取时时的音视频文件流),2,因有多路音视频流频繁同时写盘,每次通过获取硬盘空间大小做判断,太费系统资源,怕影象整个系统的稳定性。
#11
如果不这样的话,你在用Stream去写的话,如果出现硬盘空间不够的话,会有异常。
然后你进行捕获,应该是IOException。
然后你进行捕获,应该是IOException。
#12
确实捕获的到,但还是无法关闭次FS流,一关就报错
#13
你为什么不在写之前就判断一下呢
#14
我现在在做一个硬盘录象系统,里面数据流都是实时产生的,需要长时间录象,不是简单的文件复制,如用户愿意,他会不停的录象,谁也不知道他要录多大。而且实时获取硬盘大小,耗费系统资源也不小,加入这个判断会很影响效率的。
#15
补捉错误吧
#16
分阶段判断,比如每写一兆,判断一下空间还够1兆否?
如果空间不足,提示用户并关闭
好资源不多
如果空间不足,提示用户并关闭
好资源不多
#17
耗资源不多
#18
一般会分时段写成文件,一个小时或半个小时对应一个文件
可以考虑建一个文件管理类,可以管理多个文件
它内部自动去新建文件或者关闭文件,或者更换文件路径
然后你只管用它来读写数据就可以了
可以考虑建一个文件管理类,可以管理多个文件
它内部自动去新建文件或者关闭文件,或者更换文件路径
然后你只管用它来读写数据就可以了
#19
先写缓冲,然后定期写入文件,捕获异常的话,就改路径
#20
学习
#21
磁盘满导致写入失败会让文件无法关闭,这个似乎是1.x里面的一个Bug,以前在论坛上讨论过,是因为Close和Dispose方法里面没有屏蔽异常并且还调用非常有可能抛出异常的Flush方法。