大前提として、環境の記述が不足しています。
今回の場合気になるのは3点。
再現する環境と再現しない環境は明示的に示しましょう。再現しない環境、再現する環境、そ
れぞれを明記することは重要です。今回示しているのは再現する環境ですかね。再現しない環境は?
今回の場合、すでに回答にも出ていますが、ファイルシステムが影響しているかもしれません。NTFSかな?とは思いますが、NTFSとFAT系では大きく構造が異なるので、明示できるものはあるだけ明示したほうがいいでしょう。
# 直感的にはNTFSのMFT絡みの不具合の気もする。
また、使用したコンパイラやソースコードも重要です。fopen/fcloseなどのCの標準関数は処理系に依存した実装を取っています。場合によっては特定の処理系とハードウェアの組み合わせで発生するものかもしれません。また、コーディングミスの可能性も否定できませんので、可能ならばソースコードを示しましょう。
最後に、試験の条件と症状を詳しく書きましょう。
例えばイベントID:51が発生するタイミングが一定かどうかはデバッグの際に重要なパラメータとなります。またファイルを作成しているのであれば、ファイル名の生成方法なども重要です。(乱数?シリアル値?)
ま、最大の問題は、ここでプログラミングの質問して解決する確率はそんなに高くないってことですかね。
ここの常連の回答者でプログラミングのできそうな人員って、数えると2桁いない気がします。
質問者のせいじゃないんですけどね。
で、とりあえずテストしてみたんですが、俺の環境では再現していないように見えます。
ANSIにはmkdirに相当する関数がないので、Win32 APIのCreateDirectoryを使いました。
実装はどうやったのでしょうか?_mkdirを使いましたか?それともsystemでmkdir?
ソースはここにアップロードしておきました。パスワードはこの質問で一番邪魔そうなやつのハンドルです。
# Windowsの標準には準拠してませんけど、まあ動くのでよし。
http://www1.atword.jp/inside/wp-content/fopentest.zip
環境は自作機で、Athlon 64 X2 5000+ Black Edition、AMD 690Gマザー、4GB(3.25GB) RAM、HGST 320GB SATA HDDが主なハード側構成です。
ソフト側はWindows XP Pro SP2、Borland C++ Compiler 5.1.1です。
HDDのフォーマットはNTFSで、C:\temp上で実行しました。パーティションサイズは40GBで空きが3.9GBでした。実行後は1.7GBになりましたが。
気になるのは合計で2,002,000個ものファイル(ディレクトリ含む)を作成する、ということですね。
途中、MFTのエントリ不足で何度も拡張してましたし、場合によってはディスク容量不足なんかも可能性としては否定できないかも。(ちなみに0バイトのファイルはNTFS上ではMFTに保持されて実体はできません)
思いっきり蛇足ですが、Windows上でのマルチスレッドとC言語の組み合わせは鬼門です。
CreateThreadで起動したスレッドは、C言語のほとんどの関数でメモリリークします。
beginthreadなら問題なしですけどね。