- - PR -
フォルダのフルパスやファイル名の比較方法 VB.NET
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-10-27 17:15
プログラムの中でフルパスやファイル名を比較することはよくありますが、単純にフルパスの文字列を比較した場合、次の場合に意図した結果が得られません。
・フォルダ比較の場合の「¥」の有無 ・文字列が大文字小文字の違いによる誤判定 FSOのようにファイルそのものをオブジェクトとして扱うような方法があれば A=フォルダオブジェクト B=フォルダオブジェクト A IS B のような判定ができて間違いがなくなると思って探しています。 できるだけ、.NETの参照内で行いたいのでなるべくFSOは使いたくないのですが このような関数がなかなか見つかりません。 フォルダ照合(パス1,パス2)=true ファイル名照合(パス1,パス2)=true といった関数があれば教えていただけませんでしょうか。 functionで作るためのヒントでも結構ですのでよろしくお願いいたします。 [ メッセージ編集済み 編集者: リットン 編集日時 2007-10-27 17:16 ] [ メッセージ編集済み 編集者: リットン 編集日時 2007-10-27 17:17 ] | ||||||||||||
|
投稿日時: 2007-10-27 18:02
無いですね。 簡単に言えば「*万全*を求めると非常に難しいから」でしょう。 共有フォルダを2つの異なるネットワークドライブに割り当てたり等々、「困難であること」の根拠は片手に余るほどあるはずです。
「ドライブが異なったら異なるパスとしてよい」他、ほどほどに緩やかな判定でよいなら ・System.IO.Path.GetFullPath() でパスA、パスBを補正 ・パスA.ToUpper() と パスB.ToUpper() を比較 でよろしんじゃないかと。 パスA, パスBの両方がディレクトリ名またはファイル名であるかがわからない場合、↑に少し前処理が必要かもしれません。 | ||||||||||||
|
投稿日時: 2007-10-27 18:18
早速のレスありがとうございます。
それは思いつきませんでした。これはFSOでも回避不能ですね。 であれば、あとは
と、FSOのどちらが安全で速度があるかだと思うのですが VB.NETではなるべく外部ファイルの参照は推奨されていないというのを見たことがありますので避けなければいけないと思っていたのですが、FSOを利用されることも多いのでしょうか。 | ||||||||||||
|
投稿日時: 2007-10-27 19:07
「なんでもかんでも駄目」というわけではありません。 ですが、FSO は COM 技術をベースに作られたコンポーネントです。 .NET で COM コンポーネントを扱うには独特の難しさが伴います。 その難しさ知らない、ということなら避けるべきでしょう。 | ||||||||||||
|
投稿日時: 2007-10-27 21:22
リパースポイントとか、ジャンクションポイントとか、どう扱いましょう?
単純に「パス名を表した文字列」として比較してよいなら、 存在チェック 最後の文字がパスセパレータかのチェック ショート名かロング名かのチェック 大文字小文字の統一 ぐらいかなぁ? | ||||||||||||
|
投稿日時: 2007-10-28 08:24
>渋木宏明(ひどり)様 >Jitta様 レスありがとうございます。
残念ながら独特の難しさは知りませんが、一般に使われている方法であれば努力してでも習得したいです
とおっしゃっているニュアンスから、一般にはそのような比較は行わないのでしょうか。 COM使用のFSOにも文字列比較どちらにも予期せぬ不具合はあるかと思うので、主観的な見解で結構ですので、どのような方法がより安全と考えているのか又は普段どのような方法を使っているかを教えていただけませんか? | ||||||||||||
|
投稿日時: 2007-10-28 09:14
場合によりけりです。 既に挙げているように、「単純な文字列としての比較」だけではネットワークドライブやりパースポイントなどへの対応が十分ではありません。 逆に、それらに対する考慮が必要ないなら、多少の前処理(相対パスを絶対パスに変換する、パス名をすべて大文字/小文字に変換する、など)を行った上で「文字列として比較する」ば十分かもしれません。
すでに述べた通りです。 何の前提も無しの万能な解をお求めなのであれば、おそらくありません。 FSO もたぶん、ネットワークドライブやリパースポイントなどを真面目に追っかけたりはしてないと思います。 どうしているか?という点に関しては、必要に応じて適宜、です。 僕の場合は「存在するファイルのフルパス名同士の比較」「存在するディレクトリのフルパス名同士の比較」のどちらかを行うことが大半なので、既に述べたように Path.GetFullPath() と String.ToUpper() で前処理した文字列として比較しています。 | ||||||||||||
|
投稿日時: 2007-10-28 11:28
以下は、回答ではなくただの私の疑問です。 .NET や FSO は良く知りませんが、たとえば、だれかがあるファイルをオープンしていれば、別の人が同じファイルをオープンするときには、ファイルがすでにオープンされているなどという情報は分かったりすることもあるわけですから、ファイルシステムに問い合わせれば、ファイルが同一かどうかを返してくれないものなのでしょうか。 すなわち、Windows API レベルでは、そういう API がないのでしょうか。ファイル名を入力したら、オープンせずともファイルのハンドル(?)やIDのようなものを返してくれる API があって、そのハンドルが同一かどうかでファイルの同一性を判断できる、というような API です。 最悪、ファイルをオープンすれば分かる情報だとは思いますが、そのためだけにオープンするのは副作用がありすぎて、オープンは避けたいですが。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} |