Отримайте повний шлях без імені файлу з шляху, що включає ім'я файлу


200

Чи є щось вбудоване в це, System.IO.Pathщо дає мені лише файлову дорогу?

Наприклад, якщо у мене є string

@ "c: \ webserver \ public \ myCompany \ configs \ promo.xml",

чи є який-небудь метод BCL, який дасть мені

"c: \ webserver \ public \ myCompany \ configs \"?



FWIW: Я "відмовився" від обробки "Шляхами" Шляху, і ми використовуємо наші власні методи з кращими очікуваннями та однаковістю з UNC (спробуйте використовувати GetDirectoryName на шляху до UNC) та конвенцій (наприклад, трейлінг /).
користувач2864740

Якщо файл чи каталог не існує, неможливо знати, чи promo.xmlпозначає файл або каталог тим самим іменем. Це, мабуть, тому Path.GetDirectoryName()реалізовано так просто і просто обрізає останній сегмент, або видаляє останню косу рису, якщо така є.
Авель

Відповіді:


242

Path.GetDirectoryName()... але вам потрібно знати, що шлях, який ви проходите до нього, містить ім'я файлу; він просто видаляє остаточний біт із шляху, будь то ім'я файлу чи ім'я каталогу (він насправді не має уявлення, який).

Ви можете спочатку підтвердити тестування File.Exists()та / або Directory.Exists()на своєму шляху, щоб побачити, чи потрібно телефонуватиPath.GetDirectoryName


2
Не потрібно телефонувати File.Exists(). Дійсно, це досить контрпродуктивно в тому випадку, коли ваша причина пошуку імені каталогу полягає в тому, щоб створити його, якщо воно ще не існує.
Джон Ханна

3
Його приклад явно відзначає шлях з назвою файлу. Якщо це зразок шляхів, які він тестує, і якщо ці шляхи представляють наявні файли, перевірка File.Exists (), безумовно, була б корисною, чи не погоджуєтесь ви? Оскільки ситуація може бути інакше, я, звичайно, просто припускав, що він "може" використовувати методи існування у файлі та / або каталозі; очевидно, як підходить для його ситуації.
Ендрю Барбер

Так, шлях із назвою файлу. У цьому немає нічого, що б вказувало на існування файлу, так як назви файлів стають першими.
Джон Ханна

4
Як я сказав; це варіант, і він може допомогти залежно від того, що відомо про шлях. Або це зовсім не може бути необхідним. Але тестування File.Exists () і Directory.Exists () на одному шляху - це швидкий і простий спосіб дізнатися, чи існує шлях, який існує у файлі чи каталозі.
Ендрю Барбер

5
як швидка довідка, у надмірності з питанням та "очевидним" лікуванням, вам потрібно включити System.IOдля цього роботу.
Крегокс


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.