Удалить часть полного имени каталога? - PullRequest
5 голосов
/ 12 марта 2011

У меня есть список имен файлов с полным путем, который мне нужен, чтобы удалить имя файла и часть пути к файлу, учитывая список фильтров, который у меня есть.

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

Текущее решение на основе кода Роба:

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 ]

5 голосов
/ 12 марта 2011

Как насчет этого:

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 голос
/ 12 марта 2011

вы можете использовать этот метод для разделения пути по знаку "\" (или "/" в среде Unix). После этого вы возвращаете массив строк и можете выбрать то, что вам нужно.

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