C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.20105 の関連記事表示

<< 0 >>
■20105  Re[10]: ディレクトリの排他アクセス
□投稿者/ れい -(2008/06/05(Thu) 18:57:25)
    No20064 (y4yama さん) に返信
    > ■No20042 (れい さん) に返信
    >>ファイルハンドルと同様にも導入していれば、
    >>ファイルもディレクトリも同等に扱うAPIになっていたかもしれない。
    > 手元に1997年のwin32 APIオフィシャルリファレンスがあって、CreateFileを何気なく見たら
    > ディレクトリハンドルを返すことが記載されています。(1997では、NTに限るとあるような、?)

    はい。
    ディレクトリハンドルを取得することは可能です。排他で開くことも可能です。
    ですが、そこからエントリのリストを得るのはめんどくさい方法しかありません。

    > どうも、95,98では欠如してて、NT,2000以降では同等に扱うAPIに(現在)なっている・・という
    > 解釈はできないでしょうか? (私が、変な勘違いをしておりましたら、お許しください)

    はい。
    NT系では内部でほぼ同等に扱っています。
    95系はよくわかりません。

    私はユーザーモードアプリケーションが通常使うであろうAPIで同等になっていない、
    ということを問題にしています。

    ディレクトリ内のファイルリストを得るのに、今はFindXXXFike系のAPIを使います。
    しかし私は、
    CreateFileでディレクトリハンドルを開きそのハンドルを指定してFindFirstFileを呼ぶ、
    というような実装の方が綺麗で分かりやすいと思うのです。

    No20068 (す さん) に返信
    >普通に考えてディレクトリロックなんて傍迷惑な機能はないほうがよいのでは?

    その考えは全然「普通」ではないと私は思っています。

    まず、ディレクトリを排他で開く機能は「すでにあります」。
    OSは利用しています。
    必要ないから実装してないということにはなりません。

    また、ファイルIOはいつ失敗するか分かりませんので、
    ディレクトリのエントリ列挙をするときには例外がおきたときの処理を入れる必要があります。
    この処理が適切に入っていれば、ディレクトリの排他ロックがあっても問題なく動作します。
    「他のひとはエラー対処で大変なことに」というのは間違いです。

    同様に、再試行もデッドロックの検出も、今でも行わなければいけない事項です。

    つまり、今現在適切にファイルIOを処理をしているプログラムにとっては、
    ディレクトリの排他ロックが可能であってもコード量は変化しません。
    大変なことにはなりません。

    ですので、私は、「普通に考えて」ディレクトリを排他で開けるOSの方がよいと思ったわけです。

    問題になるとするなら、774RRさんやPATIOさんの言うように、
    共有違反やアクセス違反が頻発してしまってファイルIOに不具合が生じたり、パフォーマンスが悪くなる、
    という点です。

    どの程度悪くなるのかは実際にやってみないとわかりません。
    OS作成者がどう判断してもおかしくありませんが、
    私はあまり問題にならないと予想しています。

    y4yamaさんのリンク先、NyaRuRuさんの記事でも述べられていますが、
    ディレクトリが開かれているためにフォルダが削除できなくなることは現在でもありますが、
    あまり問題になっていません。
    ファイルを排他で開いても、それほど問題になりません。
    ですので、孫子まで自動でロックするような実装にならない限り、
    それほど大きな問題にはならないと思います。

    ちなみに、NTFSでディレクトリハンドルを排他で開いても、サブディレクトリはロックされません。
記事No.19998 のレス /過去ログ40より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -