FileStream 构造函数中有一个参数是buffersize,请问这个值设置的大小,有啥意义。谢谢了。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FileStream 构造函数中有一个参数是buffersize,请问这个值设置的大小,有啥意义。谢谢了。相关的知识,希望对你有一定的参考价值。

如果我设置的很小,有什么结果,设置的很大有什么结果?

不知道楼主说的是什么语言,不过字面上理解的话应该是文件流的缓存区大小的问题,设置太小的话可能会造成这个缓存区不够存放你要读写的数据,也就是说会造成读写结果比你预想的少;太大的话又会占用过多资源,而且这个一般表示的是存在CPU的缓存里,CPU的缓存容量很小的。 参考技术A 文件流的缓冲区大小.
设的过小,可能导致不能读出预期长度的数据
设的过大,浪费内存
所以使用的时候一般都会事先预估数据块的大小来设置buffersize
或者采取多次读取的方法来回避这个问题

在 C# 中为 FileStream 构造函数引发异常,其中 CreateNew 用于现有文件

【中文标题】在 C# 中为 FileStream 构造函数引发异常,其中 CreateNew 用于现有文件【英文标题】:Exception Thrown in C# for FileStream Constructor with CreateNew for Existing File 【发布时间】:2012-03-02 11:53:53 【问题描述】:

我正在用 C#(.NET Web 服务)创建一个文件,并且不想覆盖现有文件。

方法似乎是构造一个带有 FileMode.CreateNew 集的 FileStream。如果文件存在,它实际上会抛出异常。

但是,与文件创建引发的其他可能异常相比,我如何识别此异常? http://msdn.microsoft.com/en-us/library/47ek66wy.aspx 的文档将这种情况列为“IOException”,这显然是含糊的,因为其他事情可能会导致这种情况。

这里的答案是我捕获 IOException 然后只执行 File.Exists 吗?

【问题讨论】:

您可以使用异常中的错误代码。请参阅How do I determine the HResult for a System.IO.IOException? 文件存在,它将是 0x80070050。 @DmitryShkuropatsky:你可能应该这样回答 【参考方案1】:

我会推荐另一种方式:首先执行 File.Exist,然后捕获异常。这样您就可以确定文件已经存在这一事实不会引发异常。

【讨论】:

这并不完全正确。从技术上讲,它可以在检查和异常处理之间创建(很少见但仍然可能) 嗯,你是对的。从技术上讲,服务可以更改 InstanceContextMode.Single,而且他没有说明服务之外的文件会发生什么。【参考方案2】:

我认为 File.Exists 方法是最优雅的。您可以通过反思来尝试猜测根本原因,但这不值得。 InnerException 可能被设置为更独特的东西。是空的吗?

Message 属性应该描述(用英语或您使用的任何语言)究竟发生了什么。依赖 Message 返回的字符串也不是一个好主意。

说实话,我最喜欢你的想法。

【讨论】:

【参考方案3】:

我相信最好的方法是在尝试创建 FileStream 之前使用File.Exists。示例:

if (File.Exists(path))

   //Handle existing file

else

   FileStream newFile = new FileStream(path, FileMode.CreateNew);
   //Logic to do with your new file

试图解析 IOException 以确保它完全是“正确的” IOException 是脆弱的。我认为唯一的方法是比较 IOException 的注释或描述。

【讨论】:

这令人失望。我不想使用 File.Exists 方法,因为我不想在检查和创建之间留下一个窗口。脆弱正是我问的原因:我知道检查消息字段不是正确的答案。 嗯,我明白你的担心了。我不知道如何确保检查文件和创建文件之间没有间隙。尽管它看起来很脆弱,但我不相信来自 CreateNew 的异常消息可能会改变。如果您绝对不需要间隙,我只会比较消息,但请确保您将其记录好。请注意,不建议将捕获异常作为常规执行的一部分。因此,我建议执行 File.Exists 和 try-catch 检查 IOException 的消息。这样,在 99% 的情况下,File.Exists 会充分通知您。【参考方案4】:

您可以从异常中获取错误代码,如下所示:

int hr = Marshal.GetHRForException( ex );

如果文件存在,它将是 0x80070050。

【讨论】:

我曾希望得到一个更清晰的答案,但没想到现实是这样的。这似乎是正确的方法,也是我将采取的方法。谢谢,德米特里。

以上是关于FileStream 构造函数中有一个参数是buffersize,请问这个值设置的大小,有啥意义。谢谢了。的主要内容,如果未能解决你的问题,请参考以下文章

c++(在类中)执行buf=new char[i];delete []buf; 为啥没有调用构造和析构函数?

c# FileStream函数的FileMode参数中的其中一个枚举值OpenOrCreate的说明是啥意思?

MSDN搬运 之 [编写流]

linux编程,关于main函数的参数argv

FileStream和StreamReader,StreamWrite,BinaryWriter

如果父类中有构造函数,并且构造函数有参数,而子类没有,因为子类继承了这个构造函数,那么创建子类对象的时候,要传参