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

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

可以同时打开的文件数量有限制吗?

Solutions Collecting From Web of "Windows中打开的文件数是否有限制?"

C运行时库对于可以同时打开的文件数有512个限制。 试图打开超过最大数量的文件描述符或文件流会导致程序失败。 使用_setmaxstdio更改此号码。 有关这方面的更多信息可以在这里阅读

此外,您可能需要检查您的Windows版本是否支持使用_setmaxstdio设置的_setmaxstdio 有关_setmaxstdio更多信息,请点击这里

有关VS 2015对应的信息可以在这里找到

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

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

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

如果在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选项在服务器启动。

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

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

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

我不知道Paulo从那里得到了那个数字。在基于Windows NT的操作系统中,每个进程打开的文件句柄的数量基本上受到物理内存的限制 – 当然有数十万个。

是的,有一个限制。

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

在旧的DOS中,限制是255个同时打开的文件。

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

遇到同样的问题,但使用Embarcadero C + +的RAD Studio 10.2的生成器。 这个东西的C运行时似乎没有提供_getmaxstdio_setmaxstdio ,但是一些宏和它们的默认限制远远低于这里所说的其他运行时:

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