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


198

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

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

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

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

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



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


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;

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));
        }
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.