4

以下のコードで使用Path.GetFileName()すると、意図したとおりに機能し、正しいフォルダーの名前が返されることがわかりましたが、使用するPath.GetDirectoryName()と、代わりに親 (UserGeneratedContent) フォルダーの名前が返されます。両方のメソッドに同じパスが文字列として渡されると、なぜこれが発生するのですか? そして、なぜPath.GetFileName()ディレクトリで機能するのですか?

Treeview でノードのテキストを使用するPath.GetFileName()と、見つかったフォルダーのテキストになります。これは私がやりたいことですが、テキストを使用すると、 @"UserGeneratedContent"から各ノードPath.GetDirectoryName()のフル パスになります。なぜそれが起こるのですか?

最後に、コードを改善できますか?

private void CheckForBaseFolder()
{
    if (Directory.Exists(@"UserGeneratedContent"))
    {
        DirectoryInfo info = new DirectoryInfo(@"UserGeneratedContent");
        DirectoryInfo[] subdirs = info.GetDirectories();

        if (subdirs.Length != 0)
        {
            string path = Path.Combine(@"UserGeneratedContent", subdirs[0].ToString());
            treeView1.Nodes.Add(CheckForSubFolders(path));
            treeView1.SelectedNode = treeView1.Nodes[0];
        }
        else { MessageBox.Show("No User-Generated Folders Or Files Found"); }    
    }
    else { Directory.CreateDirectory(@"UserGeneratedContent"); }
}

private TreeNode CheckForSubFolders(string path)
{
    TreeNode folder = new TreeNode(path);

    folder.Text = Path.GetFileName(path); // Works as intended, but.....
    folder.Text = Path.GetDirectoryName(path); // Returns the parent folder 

    foreach(var subdirectory in Directory.GetDirectories(path))
    {
        folder.Nodes.Add(CheckForSubFolders(subdirectory));                
    }

    folder.ImageIndex = 0;
    folder.SelectedImageIndex = 1;

    return folder;
}
4

3 に答える 3

3

コードを確認してください。ファイル名を含まないパスを渡していますが、パスの最後の部分はディレクトリ UserGeneratedContent です。「パス内の最後のディレクトリ文字の後の文字」をPath.GetFileName返すため、ファイル名ではなく最後のディレクトリ名を返します(拡張子なしのファイルを作成できます)。同じパス文字列で呼び出す と、 「パスのディレクトリ情報」が返されます。Path.GetDirectoryName()

このコードをチェックして、私が何を指しているのかを確認してください。

C パーティションにディレクトリ "one"、ディレクトリ "one" にディレクトリ "two"、ディレクトリ "two" に "three.txt" という名前のファイルがあるとします。このコードを実行すると、次のようになります。

string directory = Path.GetFileName(@"C:\one\two");
directory = Path.GetDirectoryName(@"C:\one\two");

directory最初に「two」を保持し、次に「C:\one」を保持します

string filename = Path.GetFileName(@"C:\one\two\three.txt");
directory = Path.GetDirectoryName(@"C:\one\two\three.txt");

しかし今、filename「three.txt」directoryを保持し、「C:\one\two」を保持します

編集:これは後でコメントの後に編集しますCheckForSubFoldersこの方法でメソッドを変更します。

private TreeNode CheckForSubFolders(string path)
    {

        TreeNode folder = new TreeNode(path);
        string dir = path.TrimEnd(new char[] { '\\' });
        int index = dir.LastIndexOf('\\');
        folder.Text = dir.Substring(index + 1);

        //But I think that it is OK to use folder.Text = Path.GetFileName(path); 
        //since the filename of some file will never be passed to the CheckForSubFolders method         

        foreach(var subdirectory in Directory.GetDirectories(path))
        {

            folder.Nodes.Add(CheckForSubFolders(subdirectory));
        }

        folder.ImageIndex = 0;
        folder.SelectedImageIndex = 1;
        return folder;
    }
于 2012-11-06T22:05:02.787 に答える
2

Path.GetDirectoryNameの MSDN cliams として単純に:

ほとんどの場合、このメソッドによって返される文字列は、最後の DirectorySeparatorChar または AltDirectorySeparatorChar までのパス内のすべての文字で構成されます。

したがって、パラメーターがディレクトリ自体へのパスである場合、親ディレクトリがあればそれを選択します。

于 2012-11-06T22:01:05.410 に答える
1

まず第一に、ディレクトリを指しているパスとファイルを指しているパスとの違いをどのように見分けることができますか? (ドットと拡張子をfile含まない)という名前のファイルを作成でき、ドットを含むフォルダーを作成できるため、単にできません。.folder.txt

では、パスがファイルを指しているかどうかを判断するロジックをどのように実装しますか?

質問の方法に答えるには、最後のパス部分がファイル名であるGetFileNameGetDirectoryName単純に仮定します。

于 2012-11-06T21:58:18.643 に答える