2

私はおそらくタイトルをあまりよく言いませんでしたが、うまくいけば私の説明が問題を説明するはずです。

基本的に、比較する別のパスが与えられたときに、ファイル名を除くサブディレクトリの名前を見つける必要があります。例えば、

Given: "C:\Windows\System32\catroot\sys.dll"

Compare: "C:\Windows"

Matched String: "\System32\catroot"

別の例を次に示します。

Given: "C:\Windows\System32\WindowsPowerShell\v1.0\Examples\profile.ps1"

Compare: "C:\Windows\System32"

Matched String: "\WindowsPowerShell\v1.0\Examples"

このマッチングを実行するための最良の方法は何でしょうか?

4

2 に答える 2

4

次のような特殊なケースも検討することをお勧めします。

  • 相対パス

  • C:\PROGRA~1forなどの短い名前のパスC:\Program Files

  • 非正規パス(C:\Windows\System32\..\..\file.dat

  • /(の代わりに\)代替セパレーターを使用するパス

Path.GetFullPath1つの方法は、比較する前にを使用して正規のフルパスに変換することです。

例えば

string toMatch = @"C:\PROGRA~1/";
string path1 = @"C:/Program Files\Common Files\..\file.dat";
string path2 = @"C:\Program Files\Common Files\..\..\file.dat";

string toMatchFullPath = Path.GetFullPath(toMatch);
string fullPath1 = Path.GetFullPath(path1);
string fullPath2 = Path.GetFullPath(path2);

// fullPath1 = C:\Program Files\file.dat
// toMatchFullPath = C:\Program Files\
if (fullPath1.StartsWith(toMatchFullPath, StringComparison.OrdinalIgnoreCase))
{
    // path1 matches after conversion to full path
}

// fullPath2 = C:\file.dat
// toMatchFullPath = C:\Program Files\
if (fullPath2.StartsWith(toMatchFullPath, StringComparison.OrdinalIgnoreCase))
{
    // path2 does not match after conversion to full path
}
于 2012-09-07T08:33:52.603 に答える
0

正規表現を使用する必要はありません。これは、 string.StartsWithstring.Substring、およびPath.GetDirectoryName
を 使用してファイル名を削除することで簡単に実行できます。

string fullPath = @"C:\Windows\System32\WindowsPowerShell\v1.0\Examples\profile.ps1"; 
string toMatch = @"C:\Windows\System32";
string result = string.Empty;
if(fullPath.StartsWith(toMatch, StringComparison.CurrentCultureIgnoreCase) == true)
{
    result = Path.GetDirectoryName(fullPath.Substring(toMatch.Length));
} 
Console.WriteLine(result);

編集:この変更はaiodintsovからの観察を処理し、非正規または部分的なパス名に関する@Joeからのアイデアを含みます

string fullPath = @"C:\Windows\System32\WindowsPowerShell\v1.0\Examples\profile.ps1"; 
string toMatch = @"C:\Win";

string result = string.Empty;
string temp = Path.GetDirectoryName(Path.GetFullPath(fullPath));
string[] p1 = temp.Split('\\');
string[] p2 = Path.GetFullPath(toMatch).Split('\\');
for(int x = 0; x < p1.Length; x++)
{
   if(x >= p2.Length || p1[x] != p2[x]) 
             result = string.Concat(result, "\\", p1[x]);
}

この場合、部分一致は一致しないと見なされるべきであると思います。また、部分的または非正規パスの問題については、@Joeからの回答を参照してください。

于 2012-09-07T07:57:36.363 に答える