경로에서 폴더 이름 얻기


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

어떤 객체 또는 메소드를 사용하여 결과를 얻을 수 folder2있습니까?


5
C : \ folder1 \ folder2 \ folder3 \ file.txt를 갖고 있다면 "folder3"을 원합니까?
Steve Danner

답변:


335

아마 다음과 같은 것을 사용할 것입니다 :

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

내부 호출 GetDirectoryName은 전체 경로를 반환하고 외부 호출 GetFileName()은 마지막 경로 구성 요소 (폴더 이름)를 반환합니다.

이 방법은 경로가 실제로 존재하는지 여부에 관계없이 작동합니다. 그러나이 방법은 파일 이름으로 처음 끝나는 경로에 의존합니다. 경로가 파일 이름 또는 폴더 이름으로 끝나는 지 여부를 알 수없는 경우 실제 경로를 확인하여 파일 / 폴더가 먼저 위치에 있는지 확인해야합니다. 이 경우 Dan Dimitru의 답변이 더 적합 할 수 있습니다.


133
또 다른 해결책 : return new DirectoryInfo (fullPath) .Name;
Davide Icardi

1
Davide Icardi의 솔루션은 상대 경로가 있기 때문에 나에게 더 효과적이었습니다. 감사.
akatran

4
@DavideIcardi 귀하의 의견은 정말 답이되어야합니다.
Ondrej Janacek

3
@DavideIcardi 솔루션에는 경로에 파일 (디렉토리 경로)이 포함되어 있지 않으면 작동하지 않습니다.
Aage

6
경고 :이 해결책은 잘못되었습니다! "C : / bin / logs"의 경우 "bin"을 반환합니다. return new DirectoryInfo (fullPath)를 사용하십시오 .Name; 대신에.
Chris W

36

이 시도:

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

23

간단하고 깨끗합니다. 만 사용 System.IO.FileSystem-매력처럼 작동합니다.

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

3
이 경우 폴더는 file.txt그렇지 않습니다.folder2
TJ Rockefeller

13

DirectoryInfo 는 디렉토리 이름을 제거하는 작업을 수행합니다.

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

7

파일 이름이 경로에 없을 때이 코드 스 니펫을 사용하여 경로의 디렉토리를 가져옵니다.

예를 들어 "c : \ tmp \ test \ visual";

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

산출:

시각적


Path.GetFileName (dir)을 수행하면 폴더 이름이 올바르게 반환됩니다.
jrich523

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

2

또한 루프에서 디렉토리 이름 목록을 가져 오는 동안 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

1

아래 코드는 폴더 이름 만 얻는 데 도움이됩니다.

 공개 ObservableCollection 항목 = 새로운 ObservableCollection ();

   시험
            {
                문자열 [] folderPaths = Directory.GetDirectories (stemp);
                items.Clear ();
                foreach (폴더 경로의 문자열 s)
                {
                    items.Add (new gridItems {foldername = s.Remove (0, s.LastIndexOf ( '\\') + 1), folderpath = s});

                }

            }
            캐치 (예외 a)
            {

            }
  공개 클래스 gridItems
    {
        공개 문자열 폴더 이름 {get; 세트; }
        공개 문자열 폴더 경로 {get; 세트; }
    }

0

이것은 추악하지만 할당을 피합니다.

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.