删除部分完整目录名称?

时间:2011-03-12 14:56:40

标签: c# .net-2.0

我有一个带有完整路径的文件名列表,我需要删除文件名和文件路径的一部分,考虑到我的过滤器列表。

Path.GetDirectoryName(file)

是否有部分工作,但我想知道是否有一种简单的方法可以使用.Net 2.0过滤路径来删除部分路径。

例如:

如果path + filename等于C:\my documents\my folder\my other folder\filename.exe,我需要的就是my folder\以上的内容,这意味着我只需要从中提取my other folder

更新

过滤器列表是一个文件框,文件夹名称以,分隔,因此我只有部分名称,如上例所示,此处的过滤器为my folder

基于Rob代码的当前解决方案:

string relativeFolder = null;
string file = @"C:\foo\bar\magic\bar.txt";
string folder = Path.GetDirectoryName(file);
string[] paths = folder.Split(Path.DirectorySeparatorChar);
string[] filterArray = iFilter.Text.Split(',');

foreach (string filter in filterArray)
{
    int startAfter = Array.IndexOf(paths, filter) + 1;
    if (startAfter > 0)
    {
        relativeFolder = string.Join(Path.DirectorySeparatorChar.ToString(), paths, startAfter, paths.Length - startAfter);
        break;
    }
}

2 个答案:

答案 0 :(得分:5)

这样的事情怎么样:

private static string GetRightPartOfPath(string path, string startAfterPart)
{
    // use the correct seperator for the environment
    var pathParts = path.Split(Path.DirectorySeparatorChar);

    // this assumes a case sensitive check. If you don't want this, you may want to loop through the pathParts looking
    // for your "startAfterPath" with a StringComparison.OrdinalIgnoreCase check instead
    int startAfter = Array.IndexOf(pathParts, startAfterPart);

    if (startAfter == -1)
    {
        // path not found
        return null;
    }

    // try and work out if last part was a directory - if not, drop the last part as we don't want the filename
    var lastPartWasDirectory = pathParts[pathParts.Length - 1].EndsWith(Path.DirectorySeparatorChar.ToString());
    return string.Join(
        Path.DirectorySeparatorChar.ToString(), 
        pathParts, startAfter,
        pathParts.Length - startAfter - (lastPartWasDirectory?0:1));
}

如果最后一部分是文件名,则此方法尝试计算,如果是,则删除它。

调用它
GetRightPartOfPath(@"C:\my documents\my folder\my other folder\filename.exe", "my folder");

返回

  

我的文件夹\我的其他文件夹

调用它
GetRightPartOfPath(@"C:\my documents\my folder\my other folder\", "my folder");

返回相同的内容。

答案 1 :(得分:1)

您可以使用此方法通过“\”符号(或Unix环境中的“/”)拆分路径。在此之后,您将获得一系列字符串,您可以选择所需的字符串。

        public static String[] SplitPath(string path)
        {
            String[] pathSeparators = new String[] 
            { 
                Path.DirectorySeparatorChar.ToString()
            };
            return path.Split(pathSeparators, StringSplitOptions.RemoveEmptyEntries);
        }