Как извлечь каталог из пути, включая символы подстановки? - PullRequest
2 голосов
/ 18 ноября 2011

С учетом таких путей:

C:\Temp\SomeDirectory\*.xml

Я бы хотел отличить *.xml от C:\Temp\SomeDirectory

Однако я не хочу, чтобы путь ккаталог, у которого нет завершающего слеша для возврата его родительского каталога.

Это означает, что я хочу следующее поведение:

// Wildcard paths return directory
C:\Temp\SomeDirectory\*.csv -> C:\Temp\SomeDirectory

// Trailing slash paths return full path
C:\Temp\SomeDirectory\ -> C:\Temp\SomeDirectory     

// Non-trailing slash paths to a directory return full path
C:\Temp\SomeDirectory -> C:\Temp\SomeDirectory

// Paths to a file return the directory
C:\Temp\SomeDirectory\SomeFileThatExists.csv -> C:\Temp\SomeDirectory

// Paths to a file without an extension (that exists) return the directory
C:\Temp\SomeDirectory\SomeFileThatExistsWithNoExt -> C:\Temp\SomeDirectory

// Paths to a non-existent path without a trailing slash are standard
// Either always clip the trailing part, or always leave it in
// (Can live with this one being C:\Temp\SomeDirectory)
C:\Temp\SomeDirectory\NonExistentObject -> C:\Temp\SomeDirectory\NonExistentObject 

// Paths to a non-existent path with a trailing slash return the full path
C:\Temp\SomeDirectory\NonExistentObject\ -> C:\Temp\SomeDirectory\NonExistentObject

// Paths to a non-existent path with a file extension return the directory
C:\Temp\SomeDirectory\NonExistentFile.Ext -> C:\Temp\SomeDirectory

(я не смущен, если возвращаемое значение имеетзавершающий слеш или нет, хотя метод, который я последовательно описал ниже, не возвращает завершающий слеш)

Мой текущий код выглядит примерно так и обрабатывает следующие случаи:

public string GetDirectory(string path)
{
    try
    {
        var f = new FileInfo(path); // Throws if invalid path, e.g. wildcards

        // Existent directory
        if (Directory.Exists(path))
        {
            // Full path must be a directory, so return full path
            // Ensure to add a trailing slash, as if it's missing it will return parent directory
            return Path.GetDirectoryName(path + '/');
        }

        // Non-existent directory (or ambiguous path without an extension or trailing slash)
        if (!System.IO.File.Exists(path) && String.IsNullOrEmpty(Path.GetExtension(path)))
        {
            // Path is to a non-existent file (without an extension) or to a non-existent directory.
            // As the path does not exist we will standardise and treat it as a directory.
            return Path.GetDirectoryName(path + '/');
        }

        // Path is to a file, return directory
        return Path.GetDirectoryName(path);
    }
    catch (ArgumentException)
    {
        // For wildcards/invalid paths, return the directory
        // This maps C:\Dir\*.csv to C:\Dir
        // Also maps C:\Dir&*A*#$!@& to C:\
        return Path.GetDirectoryName(path);
    }
}

Есть ли лучший способ добиться такого поведения или моя конечная цель - получить «каталог» по пути, который может включать подстановочные знаки?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Есть ли у вас контроль над генерацией списка путей?Если бы вы могли убедиться, что все пути к каталогам заканчиваются косой чертой (что, я считаю, является соглашением), тогда простой Path.GetDirectoryName(path) будет работать для всех этих случаев.

2 голосов
/ 18 ноября 2011

Проблема, которую я считаю, состоит в том, что методы Path - это просто функции работы со строками. Я не верю, что они на самом деле выходят и выясняют, смотрите ли вы каталог или файл без расширения.

Вам необходимо использовать класс Directory или File вместе, чтобы выяснить, что это такое, а затем вручную изменить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...