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~1forC:\Program Files

  • 非规范路径 ( C:\Windows\System32\..\..\file.dat)

  • 使用备用分隔符的路径(/而不是\

Path.GetFullPath一种方法是在比较之前使用转换为规范的完整路径

例如

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.SubstringPath.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 回答