- PR -

フォルダのフルパスやファイル名の比較方法 VB.NET

投稿者投稿内容
リットン
会議室デビュー日: 2007/10/27
投稿数: 6
投稿日時: 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 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-10-27 18:02
引用:

このような関数がなかなか見つかりません。



無いですね。

簡単に言えば「*万全*を求めると非常に難しいから」でしょう。
共有フォルダを2つの異なるネットワークドライブに割り当てたり等々、「困難であること」の根拠は片手に余るほどあるはずです。

引用:

functionで作るためのヒントでも結構ですのでよろしくお願いいたします。



「ドライブが異なったら異なるパスとしてよい」他、ほどほどに緩やかな判定でよいなら

・System.IO.Path.GetFullPath() でパスA、パスBを補正
・パスA.ToUpper() と パスB.ToUpper() を比較

でよろしんじゃないかと。

パスA, パスBの両方がディレクトリ名またはファイル名であるかがわからない場合、↑に少し前処理が必要かもしれません。
リットン
会議室デビュー日: 2007/10/27
投稿数: 6
投稿日時: 2007-10-27 18:18
早速のレスありがとうございます。
引用:

無いですね。
共有フォルダを2つの異なるネットワークドライブに割り当てたり等々


それは思いつきませんでした。これはFSOでも回避不能ですね。

であれば、あとは
引用:

・System.IO.Path.GetFullPath() でパスA、パスBを補正
・パスA.ToUpper() と パスB.ToUpper() を比較


と、FSOのどちらが安全で速度があるかだと思うのですが
VB.NETではなるべく外部ファイルの参照は推奨されていないというのを見たことがありますので避けなければいけないと思っていたのですが、FSOを利用されることも多いのでしょうか。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-10-27 19:07
引用:

VB.NETではなるべく外部ファイルの参照は推奨されていない



「なんでもかんでも駄目」というわけではありません。

ですが、FSO は COM 技術をベースに作られたコンポーネントです。
.NET で COM コンポーネントを扱うには独特の難しさが伴います。

その難しさ知らない、ということなら避けるべきでしょう。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-27 21:22
リパースポイントとか、ジャンクションポイントとか、どう扱いましょう?

単純に「パス名を表した文字列」として比較してよいなら、
存在チェック
最後の文字がパスセパレータかのチェック
ショート名かロング名かのチェック
大文字小文字の統一

ぐらいかなぁ?
リットン
会議室デビュー日: 2007/10/27
投稿数: 6
投稿日時: 2007-10-28 08:24
>渋木宏明(ひどり)様 >Jitta様 レスありがとうございます。
引用:

.NET で COM コンポーネントを扱うには独特の難しさが伴います。


残念ながら独特の難しさは知りませんが、一般に使われている方法であれば努力してでも習得したいです

引用:

単純に「パス名を表した文字列」として比較してよいなら、


とおっしゃっているニュアンスから、一般にはそのような比較は行わないのでしょうか。

COM使用のFSOにも文字列比較どちらにも予期せぬ不具合はあるかと思うので、主観的な見解で結構ですので、どのような方法がより安全と考えているのか又は普段どのような方法を使っているかを教えていただけませんか?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-10-28 09:14
引用:

引用:

単純に「パス名を表した文字列」として比較してよいなら、


とおっしゃっているニュアンスから、一般にはそのような比較は行わないのでしょうか。



場合によりけりです。
既に挙げているように、「単純な文字列としての比較」だけではネットワークドライブやりパースポイントなどへの対応が十分ではありません。

逆に、それらに対する考慮が必要ないなら、多少の前処理(相対パスを絶対パスに変換する、パス名をすべて大文字/小文字に変換する、など)を行った上で「文字列として比較する」ば十分かもしれません。

引用:

COM使用のFSOにも文字列比較どちらにも予期せぬ不具合はあるかと思うので、主観的な見解で結構ですので、どのような方法がより安全と考えているのか又は普段どのような方法を使っているかを教えていただけませんか?



すでに述べた通りです。

何の前提も無しの万能な解をお求めなのであれば、おそらくありません。
FSO もたぶん、ネットワークドライブやリパースポイントなどを真面目に追っかけたりはしてないと思います。

どうしているか?という点に関しては、必要に応じて適宜、です。
僕の場合は「存在するファイルのフルパス名同士の比較」「存在するディレクトリのフルパス名同士の比較」のどちらかを行うことが大半なので、既に述べたように Path.GetFullPath() と String.ToUpper() で前処理した文字列として比較しています。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-10-28 11:28
引用:

リットンさんの書き込み (2007-10-27 17:15) より:
できるだけ、.NETの参照内で行いたいのでなるべくFSOは使いたくないのですが
このような関数がなかなか見つかりません。


以下は、回答ではなくただの私の疑問です。

.NET や FSO は良く知りませんが、たとえば、だれかがあるファイルをオープンしていれば、別の人が同じファイルをオープンするときには、ファイルがすでにオープンされているなどという情報は分かったりすることもあるわけですから、ファイルシステムに問い合わせれば、ファイルが同一かどうかを返してくれないものなのでしょうか。

すなわち、Windows API レベルでは、そういう API がないのでしょうか。ファイル名を入力したら、オープンせずともファイルのハンドル(?)やIDのようなものを返してくれる API があって、そのハンドルが同一かどうかでファイルの同一性を判断できる、というような API です。
最悪、ファイルをオープンすれば分かる情報だとは思いますが、そのためだけにオープンするのは副作用がありすぎて、オープンは避けたいですが。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

スキルアップ/キャリアアップ(JOB@IT)