С учетом таких путей:
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);
}
}
Есть ли лучший способ добиться такого поведения или моя конечная цель - получить «каталог» по пути, который может включать подстановочные знаки?