Получить полный путь без имени файла из пути, который включает имя файла

198

Есть ли что-то встроенное, System.IO.Pathчто дает мне только путь к файлу?

Например, если у меня есть string

@ "C: \ вебсервер \ Public \ моякомп \ конфиги \ promo.xml",

есть ли метод BCL, который даст мне

"C: \ вебсервер \ Public \ моякомп \ конфиги \"?

CantSleepAgain
источник
5
Возможный дубликат Как я могу получить каталог из полного пути файла?
голубоватое
FWIW: Я «отказался» от обработки Path «путей», и мы используем наши собственные методы с лучшими ожиданиями и единообразием с UNC (попробуйте использовать GetDirectoryName на пути UNC) и соглашениями (например, trailing /).
user2864740
Если файл или каталог не существует, нет способа узнать, promo.xmlобозначает ли файл или каталог с тем же именем. Вероятно, поэтому Path.GetDirectoryName()он реализован так просто и просто обрезает последний сегмент или удаляет завершающий слеш, если он есть.
Авель

Ответы:

241

Path.GetDirectoryName()... но вам нужно знать, что путь, по которому вы идете, содержит имя файла; он просто удаляет последний бит из пути, будь то имя файла или имя каталога (на самом деле он не знает, какой именно).

Сначала вы можете проверить, протестировав File.Exists()и / или Directory.Exists()указав свой путь, чтобы узнать, нужно ли вам позвонитьPath.GetDirectoryName

Эндрю Барбер
источник
2
Там нет необходимости звонить File.Exists(). На самом деле, это довольно контрпродуктивно в том случае, если ваша причина поиска имени каталога - создать его, если он еще не существует.
Джон Ханна
3
Его пример явно отмечает путь с именем файла. Если это шаблон путей, которые он тестирует, и если эти пути представляют существующие файлы, то проверка File.Exists () наверняка будет полезна, вы не согласны? Конечно, поскольку ситуация могла быть иной, я просто предлагал, чтобы он «мог» использовать методы Exists в File и / или Directory; очевидно, в соответствии с его ситуацией.
Эндрю Барбер
Да, путь с именем файла. В этом нет ничего, что указывало бы на то, что файл существует, так как имена файлов идут первыми.
Джон Ханна
4
Как я сказал; это вариант, и он может помочь в зависимости от того, что известно о пути. Или это может быть не нужно вообще. Но тестирование File.Exists () и Directory.Exists () по одному и тому же пути - это быстрый и простой способ узнать, является ли существующий путь файлом или каталогом.
Эндрю Барбер
5
в качестве краткого справочника, в избыточности с вопросом и «очевидным» подходом, нужно включить, System.IOчтобы это работало.
Cregox
70
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 
исследователь
источник
2
Это лучшее. Не забудьте using System.IO;использовать методы пути
Синтаксическая ошибка
Обратите внимание, что это не включает в себя косую черту (добавить ее тривиально)
Mingwei Samuel
51

Path.GetDirectoryName()возвращает имя каталога, поэтому для того, что вы хотите (с завершающим обратным символом солидуса), вы можете позвонить Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar.

Джон Ханна
источник
12
    string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml";

    string currentDirectory = Path.GetDirectoryName(fileAndPath);

    string fullPathOnly = Path.GetFullPath(currentDirectory);

currentDirectory: c: \ webserver \ public \ myCompany \ configs

fullPathOnly: c: \ webserver \ public \ myCompany \ configs

Коби Уильямс
источник
6
Пожалуйста, предоставьте некоторую информацию о том, как код выше отвечает на вопрос, чтобы улучшить этот ответ.
Эрик Хауэнштейн
1
Path.GetFullPath возвращает полный путь без имени файла.
Коби Уильямс
показ вывода был бы полезен, я понятия не имею, в чем разница между двумя последними строками.
Гакера
вывод будет -> c: \ webserver \ public \ myCompany \ configs
Коби Уильямс
5

Используйте 'GetParent ()', как показано, работает хорошо. Добавьте проверку ошибок, как вам нужно.

var fn = openFileDialogSapTable.FileName;
var currentPath = Path.GetFullPath( fn );
currentPath = Directory.GetParent(currentPath).FullName;
kevinwaite
источник
4

Я использовал это, и это хорошо работает:

string[] filePaths = Directory.GetFiles(Path.GetDirectoryName(dialog.FileName));

foreach (string file in filePaths)
{   
    if (comboBox1.SelectedItem.ToString() == "")
    {
        if (file.Contains("c"))
        {
            comboBox2.Items.Add(Path.GetFileName(file));
        }
    }
}
Karam
источник