С#: необходимо удалить последнюю папку из пути к имени файла

Я вытаскиваю путь к файлу из базы данных для использования в качестве источника файла. Мне нужно удалить последнюю папку из исходного пути, поэтому я могу создать новые папки для использования в качестве пути назначения.

Пример пути к исходному файлу: \\\\ServerName\\Documents\\MasterDocumentFolder\\

Мне нужно удалить последнюю папку из этой строки и получить следующее: \\\\ServerName\\Documents\\

Итак, я могу создать такую ​​папку: \\\\ServerName\\Documents\\NewDocumentFolder1\\

Изменить: я обновил мои примеры, чтобы показать, почему Path.GetDirectoryName() не будет работать в этом случае.

Ответы

Ответ 1

То, что вы ищете, это метод GetParent() в классе Directory

string path = @"C:\Documents\MasterDocumentFolder\";
DirectoryInfo parentDir = Directory.GetParent(path);
// or possibly
DirectoryInfo parentDir = Directory.GetParent(path.EndsWith("\\") ? path : string.Concat(path, "\\"));

// The result is available here
var myParentDir = parentDir.Parent.FullName

Ответ 2

Это некрасиво, но работает

string path = @"C:\Documents\MasterDocumentFolder\file.any";
var lastFolder = Path.GetDirectoryName(path);
var pathWithoutLastFolder = Path.GetDirectoryName(lastFolder);

Но если у вас менее одного уровня каталогов (корень диска), то pathWithoutLastFolder будет null, поэтому вам придется иметь дело с ним.

Ответ 3

Это должно учитывать путь, являющийся либо файлом, либо каталогом

DirectoryInfo parent = null;
if (File.Exists(path))
{
    parent = new FileInfo(path).Directory.Directory
}
if(Directory.Exists(path))
{
    parent = new DirectoryInfo(path).Directory;
}

Ответ 4

System.IO.DirectoryInfo - это, пожалуй, самый чистый способ выполнить то, о чем вы просите.

var path = "\\\\ServerName\\Documents\\MasterDocumentFolder\\";
string newPath = new DirectoryInfo(path).Parent.CreateSubdirectory("NewDocumentFolder1").FullName;
Console.WriteLine(newPath.FullName);
//> "\\ServerName\Documents\NewDocumentFolder1\"

Обратите внимание, что DirectoryInfo НЕ требует наличия существующего или доступного каталога:

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\Mn");
Console.WriteLine( dir.Exists );
//> False

Но убедиться, что он существует, есть привязка

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\Mn");
dir.Create();
Console.WriteLine( dir.Exists );
//> True

Он также сделает изящные вещи, например, разрешает относительные пути:

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\..\..\..\Mn");
Console.WriteLine( dir.FullName );
//> C:\Asdf\Qwer\Mn

Что касается других ответов на обрезку и добавление косой черты, обратите внимание на разницу в поведении между Directory.GetParent( "... \" ) и DirectoryInfo ( "... \" ). Родитель при работе с trailing\- DirectoryInfo более согласован

Console.WriteLine( Directory.GetParent( @"C:\Temp\Test" ).FullName );
//> C:\Temp
Console.WriteLine( Directory.GetParent( @"C:\Temp\Test\" ).FullName );
//> C:\Temp\Test
Console.WriteLine( new DirectoryInfo( @"C:\Temp\Test" ).Parent.FullName );
//> C:\Temp
Console.WriteLine( new DirectoryInfo( @"C:\Temp\Test\" ).Parent.FullName );
//> C:\Temp

Опять же, чтобы избежать обращения к завершающим косым чертам, всегда используйте Path.Combine() для объединения путей и имен файлов. Он правильно обрабатывает пути, содержат ли они конечный\или нет:

Console.WriteLine( Path.Combine( @"C:\Temp\Test\", "Test.txt" ) );
//> C:\Temp\Test\Test.txt
Console.WriteLine( Path.Combine( @"C:\Temp\Test", "Test.txt" ) );
//> C:\Temp\Test\Test.txt
Console.WriteLine( Path.Combine( @"C:\", "Temp", "Test", "Test.txt" ) );
//> C:\Temp\Test\Test.txt

Ответ 5

Вы пытались разделить строку на "\", а затем восстановить новый путь, соединяя каждый элемент, но последний?

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

Ответ 6

С помощью этого метода вы можете создать dir с помощью dirPath (если dir не существует) и создать каталог из filePath, если это необходимо.

private void CreateDirIfNotExist(string dirPath, bool removeFilename = false)
{
    if (removeFilename)
        dirPath = Directory.GetParent(dirPath).FullName;

    if (!Directory.Exists(dirPath))
        Directory.CreateDirectory(dirPath);
}

Ответ 7

В VB:

Dim MyNewPath As String = StrReverse(Strings.Split(StrReverse(MyPath), "\", 2)(1))

Это работает вплоть до корня, например, C:\MyPath но не работает (без проверки) для пустой папки.

Очевидно, что вам нужно работать по-разному, если есть добавленный файл.