Windowsで正規のファイル名を解決するにはどうすればよいですか?
質問
Windowsでファイルパスに解決される文字列がある場合、ファイル名の正規形式を取得する方法はありますか?
たとえば、次のことを知りたい
C:\stuff\things\etc\misc\whatever.txt
and
C:\stuff\things\etc\misc\other\..\whatever.txt
実際に同じファイルを指すかどうかを指定し、パスの正規形式をアプリケーションに保存します。
単純な文字列比較は機能せず、RegExマジックも機能しないことに注意してください。 Windows 2000以降の対処すべき NTFS再解析ポイントのようなものがあることに注意してください。 Windows 7。
解決
簡単な答え:そうでもない。
Windowsでファイルの正規名を取得する簡単な方法はありません。ローカルファイルは、再解析ポイント、SUBST経由で利用できます。 NTFSジャンクションに対処しますか? Windowsショートカット? \\?\
-escaped filenamesについてはどうですか
リモートファイルは、マップされたドライブ文字またはUNCを介して利用できます。オリジンサーバーへのUNCですか? DFSを使用していますか?サーバーは再解析ポイントなどを使用していますか?サーバーは複数の名前で利用できますか? IPアドレスはどうですか?複数のIPアドレスがありますか?
したがって、Windowsでiノード番号のようなものを探している場合、それはそこにありません。たとえば、このページをご覧ください。 。
他のヒント
ロジャーは正しいです、簡単な方法はありません。ボリュームがファイルの一意のファイルインデックスをサポートしている場合、ファイルを開いて GetFileInformationByHandle が、これはすべてのボリュームで機能しません。
Windows API呼び出し GetFullPathName 最高のシンプルなアプローチかもしれません。
FileInfo info1 = new FileInfo(@"C:\stuff\things\etc\misc\whatever.txt");
FileInfo info2 = new FileInfo(@"C:\stuff\things\etc\misc\other\..\whatever.txt");
if (info1.FullName.Equals(info2.FullName)) {
Console.WriteLine("yep, they're equal");
}
Console.WriteLine(info1.FullName);
Console.WriteLine(info2.FullName);
出力:
うん、彼らは等しい
C:\ stuff \ things \ etc \ misc \ whatever.txt
C:\ stuff \ things \ etc \ misc \ whatever.txt
GetFinalPathNameByHandle は、あなたが求めていることをしているように見えます、Windows Vista以降で利用可能です。
jheddingsにはいい答えがありますが、使用している言語を指定しなかったため、 os.path.abspath :
> python -c "import os.path; print os.path.abspath('C:\stuff\things\etc\misc\other\..\whatever.txt')"
C:\stuff\things\etc\misc\whatever.txt
System.IO.Path.GetFullPathを使用します。入力として文字列(C:\ stuff \ things \ etc \ misc \ other .. \ whatever.txt)を受け取り、文字列(C:\ stuff \ things \ etc \ misc \ whatever.txtを出力します) )。
もう少し遅れていると思いますが、System.IO.Path.GetFullPath(" C:\ stuff \ things \ etc \ misc \ other .. \ whatever.txt")を使用すると、返されます" C:\ stuff \ things \ etc \ misc \ whatever.txt"
正規のパスを取得するには、 PathCanonicalize 関数。