C#で(ディレクトリ)パスを比較するには?
質問
もし私が2つの
DirectoryInfo
オブジェクトがある場合、意味的に同じかどうかを比較するにはどうしたらよいでしょうか。 例えば、次のようなパスはすべて
C:\temp
:
-
C:\temp
-
C:\temp\
-
C:\temp\.
-
C:\temp\x\..\..\temp\.
と等しい場合もあれば、そうでない場合もあります。
C:\temp
:
-
\temp
現在の作業ディレクトリがドライブC:\
-
temp
もし、現在の作業ディレクトリがC:\
-
C:\temp.
-
C:\temp...\
もし、現在の作業ディレクトリを考慮することが重要であれば、私は自分でそれを把握することができるので、それはそれほど重要ではありません。 しかし、unix ではドットは除去されないので、mono の下では別の結果を期待することになります。
大文字と小文字の区別は任意です。 パスは は存在するかしないか で、ユーザが に対するパーミッションがあるかどうか。 - 私はどんなI/Oも必要としない(だからパーミッションチェックもない)高速で堅牢な方法を好みますが、もし何かが組み込まれているなら、私は何でも満足です "good enough" も...。
私は、I/O なしでは、ある中間ストレージ層が同じストレージを同じファイルにたまたまマッピングしたかどうかを判断することができないことを理解しています (そして、I/O があっても、物事が十分に混乱するときは、おそらく不可能です)。 つまり、ある種のファイルシステム上で、同じファイル(存在する場合)へ必然的に解決されるようなパスです。 (B) I/O は時々問題となる副作用を引き起こし、(C) 他のさまざまなソフトウェア コンポーネントは時々提供されたパスを混乱させ、同等のパスの最も一般的な変換に影響を受けない方法で比較できることは有用であり、最後に (D) 展開の準備として事前にいくつかのサニティ チェックを行うことは有用ですが、これらは展開予定のシステムがアクセスする前に行われます。
どのように解決するのか?
から この回答 から、この方法はいくつかのエッジケースを処理することができます。
public static string NormalizePath(string path)
{
return Path.GetFullPath(new Uri(path).LocalPath)
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
.ToUpperInvariant();
}
詳しくは元の回答にあります。のように呼んでください。
bool pathsEqual = NormalizePath(path1) == NormalizePath(path2);
ファイルパスとディレクトリパスの両方で動作するはずです。
関連
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] DateTime型の誕生日から年齢を計算するにはどうしたらいいですか?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] ランダムな英数字の文字列を生成するにはどうすればよいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】WebResource.axdとは何ですか?