パスからフォルダー名を取得する


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

どのオブジェクトまたはメソッドを使用すれば、結果はfolder2どうなりますか?


5
最後のフォルダ名が必要ですか?C:\ folder1 \ folder2 \ folder3 \ file.txtがある場合、「folder3」が必要ですか?
スティーブダナー2010

回答:


335

私はおそらく次のようなものを使用します:

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

への内部呼び出しGetDirectoryNameは完全なパスを返し、外部への呼び出しGetFileName()は最後のパスコンポーネント(フォルダー名)を返します。

このアプローチは、パスが実際に存在するかどうかに関係なく機能します。ただし、このアプローチは、最初はファイル名で終わるパスに依存しています。パスがファイル名で終わるかフォルダ名で終わるか不明な場合は、実際のパスをチェックして、最初にその場所にファイル/フォルダが存在するかどうかを確認する必要があります。その場合、Dan Dimitruの回答がより適切な場合があります。


133
別の解決策:新しいDirectoryInfo(fullPath).Nameを返す。
Davide Icardi 2012

1
私は相対パスを持っていたので、Davide Icardiのソリューションは私にとってよりうまくいきました。ありがとう。
akatran 2014年

4
@DavideIcardiあなたのコメントは本当に答えになるはずです、それだけの価値があります。
Ondrej Janacek 2015

3
これは、パスにファイル(ディレクトリへのパス)が含まれていない場合には機能しませんが、@ DavideIcardiソリューションには含まれます。
年齢は

6
警告:この解決策は間違っています!「C:/ bin / logs」の場合、「bin」を返します。return new DirectoryInfo(fullPath).Name;を使用します。代わりに。
クリス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ロックフェラー

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 2014

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

2

ループでディレクトリ名のリストを取得している間、DirectoryInfoクラスは一度初期化されるため、初回の呼び出しのみが許可されることに注意することも重要です。この制限を回避するには、ループ内で変数を使用して、個々のディレクトリの名前を保存するようにしてください。

たとえば、次のサンプルコードは、文字列型のリスト内に見つかった各ディレクトリ名を追加しながら、親ディレクトリ内のディレクトリのリストをループします。

[C#]

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

以下のコードはフォルダ名のみを取得するのに役立ちます

 public ObservableCollection items = new ObservableCollection();

   試す
            {
                string [] folderPaths = Directory.GetDirectories(stemp);
                items.Clear();
                foreach(folderPathsの文字列s)
                {
                    items.Add(new gridItems {foldername = s.Remove(0、s.LastIndexOf( '\\')+ 1)、folderpath = s});

                }

            }
            キャッチ(例外a)
            {

            }
  パブリッククラスgridItems
    {
        public string foldername {get; セットする; }
        public string folderpath {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.