Windows中打开文件的数量是否有限制

Jim*_*y J 41 c++ windows

我在VC++中用fopen()打开了很多文件,但过了一段时间它就失败了.

您可以同时打开的文件数量是否有限制?

Sta*_*mer 57

C运行时库对任何时候都可以打开的文件数有512个限制.尝试打开超过最大数量的文件描述符或文件流会导致程序失败.使用_setmaxstdio更改此数.有关这方面的更多信息,请参阅此处

此外,您可能必须检查您的Windows版本是否支持您尝试设置的上限_setmaxstdio.有关_setmaxstdio查看此处的更多信息

有关VS 2015对应主题的信息可在此处找到

  • 我想强调@ephemient的最后一句话:**一个设计要求许多打开的文件可能是错误的** (12认同)
  • 另外:至少使用当前的Windows CRT,不可能_setmaxstdio超过2048个打开的文件.如果您需要更多打开的文件,则必须使用CreateFile(http://msdn.microsoft.com/en-us/library/aa363858.aspx)和相关的Win32函数.但是,需要许多打开文件的设计可能是错误的...... (9认同)

lui*_*ado 12

如果您使用Windows的标准C/C++ POSIX库,答案是"是",有一个限制.

但是,有趣的是,限制是由您正在使用的C/C++库类型强加的.

我遇到了来自MySQL 的以下JIRA线程(http://bugs.mysql.com/bug.php?id=24509).他们正在处理有关打开文件数量的相同问题.

但是,Paul DuBois解释说,通过使用...可以在Windows中有效地消除该问题.

Win32 API调用(CreateFile(),WriteFile()等)和默认的最大打开文件数已增加到16384.通过使用--max-open-files = N选项可以进一步增加最大值服务器启动.

当然,通过使用类似于数据库连接池的技术,理论上可以有大量打开的文件,但这会对性能产生严重影响.

实际上,打开大量文件可能是糟糕的设计.但是,有些情况需要它.例如,如果要构建将由数千个用户或应用程序使用的数据库服务器,则服务器必须打开大量文件(或者使用文件描述符池技术来降低性能).


Dra*_*rok 11

如果其他人不清楚限制的适用范围,我认为这是一个每个进程限制而不是系统范围.

我刚写了一个小的测试程序来打开文件,直到它失败.在失败之前得到2045个文件(2045 + STDIN + STDOUT + STDERROR = 2048),然后我将其打开并运行另一个副本.

第二个副本显示相同的行为,这意味着我一次打开至少4096个文件.


Mal*_*ost 7

是的,根据您在打开文件时使用的访问级别,有一些限制.您可以使用_getmaxstdio查找限制并_setmaxstdio更改限制.