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

时间:2009-05-15 18:31:08

标签: c++ windows

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

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

7 个答案:

答案 0 :(得分:56)

C运行时库对任何时候都可以打开的文件数有512个限制。尝试打开超过最大数量的文件描述符或文件流会导致程序失败。使用_setmaxstdio更改此号码。有关此内容的详细信息,请参阅here

此外,您可能需要检查您的Windows版本是否支持您尝试使用_setmaxstdio设置的上限。有关_setmaxstdio检查here

的详细信息

可以找到有关VS 2015对应主题的信息here

答案 1 :(得分: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选项   服务器启动。

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

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

答案 2 :(得分:11)

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

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

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

答案 3 :(得分:7)

是否有限制,具体取决于您在打开文件时使用的访问级别。您可以使用_getmaxstdio查找限制,_setmaxstdio更改限制。

答案 4 :(得分:3)

我不知道Paulo从哪里得到这个号码..在基于Windows NT的操作系统中,每个进程打开的文件句柄数量基本上受到物理内存的限制 - 肯定是数十万。

答案 5 :(得分:0)

是的,有一个限制。

限制取决于操作系统和可用内存。

在老D.O.S.限制是255个同时打开的文件。

在Windows XP中,限制更高(我相信它是MSDN所述的2,048)。

答案 6 :(得分:0)

遇到了同样的问题,但使用了Embarcadero C ++ - RAD Studio 10.2的构建器。该事物的C运行时似乎不提供_getmaxstdio_setmaxstdio,但是某些macros及其默认限制远低于其他运行时所说的内容:

stdio.h中:

/* Number of files that can be open simultaneously
*/
#if defined(__STDC__)
#define FOPEN_MAX (_NFILE_)
#else
#define FOPEN_MAX (_NFILE_)
#define SYS_OPEN  (_NFILE_)
#endif

_nfile.h:

#if defined(_WIN64)
#define _NFILE_ 512
#else
#define _NFILE_ 50
#endif