C++ Windows中打开的文件数量有限制吗

C++ Windows中打开的文件数量有限制吗,c++,windows,C++,Windows,我用VC++中的fopen()打开了很多文件,但过了一会儿就失败了 您可以同时打开的文件数量有限制吗?是的,有限制,具体取决于您在打开文件时使用的访问级别。您可以使用\u getmaxstdio查找限制,并使用\u setmaxstdio更改限制。是的,存在限制 限制取决于操作系统和可用内存 在旧的D.O.S.中,同时打开的文件数量限制为255个 在Windows XP中,限制更高(我相信是2048,如所述)。C运行时库对任何时候可以打开的文件数量有512个限制。试图打开超过最大数量的文件描述符

我用VC++中的fopen()打开了很多文件,但过了一会儿就失败了


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

是的,有限制,具体取决于您在打开文件时使用的访问级别。您可以使用
\u getmaxstdio
查找限制,并使用
\u setmaxstdio
更改限制。

是的,存在限制

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

在旧的D.O.S.中,同时打开的文件数量限制为255个


在Windows XP中,限制更高(我相信是2048,如所述)。

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

此外,您可能需要检查您的windows版本是否支持您试图使用
\u setmaxstdio
设置的上限。有关
\u setmaxstdio
的更多信息,请检查


与VS 2015相对应的主题信息可以找到

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

如果其他人不清楚该限制适用于什么,我相信这是每个进程的限制,而不是整个系统

我只是写了一个小测试程序来打开文件,直到失败。在失败之前,它可以访问2045个文件(2045+STDIN+STDOUT+STDERROR=2048),然后我保持打开状态并运行另一个副本


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

如果在Windows中使用标准C/C++POSIX库,答案是“是”,这是有限制的

然而,有趣的是,限制是由您正在使用的C/C++库的类型所施加的

我遇到了来自MySQL的以下JIRA线程()。他们处理的是关于打开文件数量的相同问题

然而,PaulDubois解释说,在Windows中使用

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

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


事实上,打开大量文件可能是糟糕的设计。然而,在某些情况下需要这样做。例如,如果您正在构建一个将由数千名用户或应用程序使用的数据库服务器,则该服务器必然要打开大量文件(或者使用文件描述符池技术会影响性能)。

遇到了相同的问题,但使用的是RAD Studio 10.2的Embarcadero C++-Builder。这个东西的C运行时似乎没有提供
\u getmaxstdio
\u 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
_文件h:

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

没错,但S.O.也有局限性。此限制是否适用于可执行文件?线另外,设置MaxStdio超过2048个打开的文件是不可能的,至少在当前的Windows CRT中是不可能的。如果需要更多的打开文件,则必须使用CreateFile()和相关的Win32函数。然而,一个需要打开很多文件的设计可能是错误的……因为POSIX ish_open()函数也是一个CRT函数,这同样适用于使用它以及stdio函数fopen()。我想强调@ephemient的最后一句话:一个需要许多打开文件的设计可能是错误的。如果你使用的是CRT,这是不同的,正如OP所说。我想你可以开始一个新的自我实例(过程)2048个文件之后……或者有一个单独的可执行文件来执行以文本文件位置为参数的文件操作(每行都有操作和文件位置),并且一次处理500个文件。资源总是有限的(无论计算机和操作系统如何)。所以当然有一个限度。更好的问题是如何查询或增加该限制。这听起来像是C运行时的限制,而不是操作系统的限制。我假设如果您直接使用win32 api,您可以打开更多文件。
50
不是MS-DOS的默认限制吗?