Получение имени папки из пути

string path = "C:/folder1/folder2/file.txt";

Какие объекты или методы я могу использовать, это даст мне результат folder2?

Ответ 1

Я бы, вероятно, использовал что-то вроде:

string path = "C:/folder1/folder2/file.txt";
string lastFolderName = Path.GetFileName( Path.GetDirectoryName( path ) );

Внутренний вызов GetDirectoryName вернет полный путь, а внешний вызов GetFileName() вернет последний компонент пути, который будет именем папки.

Этот подход работает, действительно ли путь существует. Однако этот подход полагается на путь, первоначально заканчивающийся на имя файла. Если неизвестно, заканчивается ли путь в имени файла или имени папки, то для этого требуется, чтобы вы проверяли фактический путь, чтобы увидеть, существует ли файл/папка в месте сначала. В этом случае ответ Дэн Димитру может быть более уместным.

Ответ 2

Попробуйте следующее:

string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;

Ответ 3

Простой и чистый. Использует только System.IO.FileSystem - работает как шарм:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;

Ответ 4

Я использовал этот фрагмент кода, чтобы получить каталог для пути, если в пути нет имени файла:

например, "c:\tmp\test\visual";

string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));

Вывод:

визуальная

Ответ 5

DirectoryInfo выполняет работу по удалению имени каталога

string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name;  // System32

Ответ 6

var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();

Ответ 7

Ниже код помогает получить только имя папки

 public ObservableCollection items = new ObservableCollection();

   try
            {
                string[] folderPaths = Directory.GetDirectories(stemp);
                items.Clear();
                foreach (string s in folderPaths)
                {
                    items.Add(new gridItems { foldername = s.Remove(0, s.LastIndexOf('\\') + 1), folderpath = s });

                }

            }
            catch (Exception a)
            {

            }
  public class gridItems
    {
        public string foldername { get; set; }
        public string folderpath { get; set; }
    }

Ответ 8

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

Например, этот пример кода просматривает список каталогов в любом родительском каталоге, добавляя каждое найденное имя каталога в список строкового типа:

[С#]

string[] parentDirectory = Directory.GetDirectories("/yourpath");
List<string> directories = new List<string>();

foreach (var directory in parentDirectory)
{
    // Notice I've created a DirectoryInfo variable.
    DirectoryInfo dirInfo = new DirectoryInfo(directory);

    // And likewise a name variable for storing the name.
    // If this is not added, only the first directory will
    // be captured in the loop; the rest won't.
    string name = dirInfo.Name;

    // Finally we add the directory name to our defined List.
    directories.Add(name);
}

[VB.NET]

Dim parentDirectory() As String = Directory.GetDirectories("/yourpath")
Dim directories As New List(Of String)()

For Each directory In parentDirectory

    ' Notice I've created a DirectoryInfo variable.
    Dim dirInfo As New DirectoryInfo(directory)

    ' And likewise a name variable for storing the name.
    ' If this is not added, only the first directory will
    ' be captured in the loop; the rest won't.
    Dim name As String = dirInfo.Name

    ' Finally we add the directory name to our defined List.
    directories.Add(name)

Next directory

Ответ 9

Это некрасиво, но избегает выделения:

private static string GetFolderName(string path)
{
    var end = -1;
    for (var i = path.Length; --i >= 0;)
    {
        var ch = path[i];
        if (ch == System.IO.Path.DirectorySeparatorChar ||
            ch == System.IO.Path.AltDirectorySeparatorChar ||
            ch == System.IO.Path.VolumeSeparatorChar)
        {
            if (end > 0)
            {
                return path.Substring(i + 1, end - i - 1);
            }

            end = i;
        }
    }

    if (end > 0)
    {
        return path.Substring(0, end);
    }

    return path;
}

Ответ 10

// For example:
String[] filePaths = Directory.GetFiles(@"C:\Nouveau dossier\Source");
String targetPath = @"C:\Nouveau dossier\Destination";

foreach (String FileD in filePaths) 
{
  try
  {
    FileInfo info = new FileInfo(FileD);
    String lastFolderName = Path.GetFileName(Path.GetDirectoryName(FileD));

    String NewDesFolder = System.IO.Path.Combine(targetPath, lastFolderName);
    if (!System.IO.Directory.Exists(NewDesFolder))
    {
      System.IO.Directory.CreateDirectory(NewDesFolder);
    }
    String destFile = System.IO.Path.Combine(NewDesFolder, info.Name);

    File.Move(FileD, destFile );

    // Try to move
    Console.WriteLine("Moved"); // Success
  }
  catch (IOException ex)
  {
    Console.WriteLine(ex); // Write error
  }
}