答えてねっとは、
マイクロソフトが運営する
パソコンに関する
Q&Aサイトです。

質問

プログラムからファイルオープンエラー

製品名:OS製品/Windows XP/サービスパック 2

現象:おかしい/エラーが出る

懸賞ポイントが設定されています。 100

C言語で開発していますが、サイズの小さいファイルを多数出力すると、『イベントID:51』のディスクアクセスエラーが発生し、以後OSが不安定な状態となり再起動せざるを得ない状態となります。

テスト的に以下のような簡単なプログラムで試しても再現します。
※正確には、再現するマシンと再現しないマシンがあります。

  ・あるフォルダ(C:\tmpなど)の下にフォルダを2000個、
   さらにそのフォルダの下に1000個ずつの0バイトファイルを作成。
  ・ファイルは、fopenとfcloseで作成し、何も書き込まない。(つまり0バイトのファイルを作成)
  ※1プロセス、複数プロセス、複数スレッドで処理しても結果は同じ。

<環境>
 機種: DELL DIMENTION 9100 など
 OS: Windows XP SP2
 MEM: 2GB
 HDD: 300GB

回答1 (この回答は質問に対する回答です)

  • 投稿ID:A2007370213
  • 投稿日時:2007/12/05 17:04

可能性としてNortonなどのAuto-Protectなどが有効になっていてアクセスがおいつかないとか?

  •  

回答2 (この回答は質問に対する回答です)

  • 投稿ID:A2007370219
  • 投稿日時:2007/12/05 17:07

フォルダ数には400個という制限があります。
下記回避策で数を増やす必要がありますね。
http://support.microsoft.com/kb/813711/ja

  •  

回答3 (この回答は回答2に対する回答です)

  • 投稿ID:A2007370224
  • 投稿日時:2007/12/05 17:10

追記:
SP2で修正済みとありますが、掲題の「フォルダの表示設定やカスタム設定が失われる、または設定が正しくない」
が修正済みという事と思われます。

  •  

回答4 (この回答は回答2に対する回答です)

  • 投稿ID:A2007370227
  • 投稿日時:2007/12/05 17:12

> フォルダ数には400個という制限があります。
> 下記回避策で数を増やす必要がありますね。
http://support.microsoft.com/kb/813711/ja

それは、レジストリに保存される
> 各フォルダの表示設定やカスタム設定
のデフォルトの個数であって、フォルダの中に作成できるフォルダ数の上限では
ない。

質問者の質問の趣旨、そしてMSKBの中身をちゃんと理解してから回答しなさいな。

  •  

回答5 (この回答は回答4に対する回答です)

  • 投稿ID:A2007370284
  • 投稿日時:2007/12/05 18:03

4/のお偉いさん
実験・実証されたのですか?
偉そうにいつもおっしゃるが回答できないのならむやみな書込みは止めてほしい。

  •  

回答8 (この回答は回答5に対する回答です)

  • 投稿ID:A2007370330
  • 投稿日時:2007/12/05 18:47

> 実験・実証されたのですか?
ファイルの*作成*に失敗することと、フォルダの*表示*設定の個数の上限は
論理的につながりません。それがつながるというのを論理的に説明できるという
のなら、貴殿が責任を持って行ってください。

さらに、件のMSKBでは
> このデータはフォルダ全体で 400 個 (ローカル フォルダ 200 個、ネットワーク フォルダ 200 個) に制限されています。
とあり、ある特定のフォルダの中に多数のフォルダを作成していることとは
関係ないと思われます。

  •  

回答11 (この回答は回答5に対する回答です)

  • 投稿ID:A2007370400
  • 投稿日時:2007/12/05 20:33

/5
>実験・実証
してみました。
2〜3分ほどかかりますが、一つのフォルダの中にフォルダを作り、それをコピーすることを繰り返してみました。
400超えても何の変化もありません。
その後、1分ほどかけて同じコトを繰り返すと、「一つのフォルダに2000個のフォルダ」という状態以上のものを作成する事ができます。この上位のフォルダをコピーする事で質問文と同じかそれ以上の状態を作る事ができます。

>偉そうにいつもおっしゃるが回答できないのならむやみな書込みは止めてほしい。
同じコトを思いました。対象は全く違いますが。たかだか5分で検証できるのに。

  •  

回答10 (この回答は回答2に対する回答です)

  • 投稿ID:A2007370354
  • 投稿日時:2007/12/05 19:26

>フォルダ数には400個という制限があります。

試すまでもなく、本質問とは意味が全然違います。
さらに、試しましたが当然2000個のフォルダ作成は余裕で可能です。

  •  

回答6 (この回答は質問に対する回答です)

  • 投稿ID:A2007370313
  • 投稿日時:2007/12/05 18:30

ファイル作成時のファイル名・フォルダ名を生成するときにどのような規則になって
いるんでしょうかね?
ロングファイル名から8.3形式を生成するときにファイル名で何らかの衝突が発生
しているという可能性があるような気が少しします。

# FAT32ボリュームでは1フォルダにはファイル・フォルダを作成することができる
# 最大数が32,766(=2^31-2)個になっていますが、ロングファイル名を使うと、
# 8.3形式のショートファイル名生成時に衝突が発生して、早い段階でファイルが
# 作成できないということがあります。
# これは実験したことがありますので。

  •  

回答7 (この回答は回答6に対する回答です)

  • 投稿ID:A2007370319
  • 投稿日時:2007/12/05 18:33

あ、記憶間違いがあった。
FAT32の1フォルダ内のファイルの最大数は65,534(=2^16-2)個だったわ。
# 32766の右辺の式も間違っているし...
[W98:FAT16、FAT32 でディレクトリ内に作成できる最大ファイル数]
http://support.microsoft.com/kb/436213/ja

  •  

回答9 (この回答は質問に対する回答です)

  • 投稿ID:A2007370334
  • 投稿日時:2007/12/05 18:53

イベントログで確認されているようですが、
データのダンプ部からあるていど原因が絞り込めるようです。>イベント:51
http://support.microsoft.com/kb/244780/ja

fopen/fcloseではなくて、CreateFile使うとどうなんでしょね?
※自分ではちょっと試したくないので勘弁。

  •  

回答12 (この回答は質問に対する回答です)

  • 投稿ID:A2007370597
  • 投稿日時:2007/12/06 00:44

大前提として、環境の記述が不足しています。
今回の場合気になるのは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なら問題なしですけどね。

  •  

昨日の利用状況


総投稿数 898 件

回答総数 717 件

登録者数 67 人

利用登録ユーザ 2012 人

ゲスト 24453 人

ページビュー 128752

登録済みFAQ 20 件

景品応募サイト

Windows ヘルプと使い方

Microsoft Users

クロスプラットフォーム WEB ブラウザプラグイン:Silverlight