为什么Path.GetFileName()返回正确文件夹的名称,但Path.GetDirectoryName()返回父文件夹?

时间:2012-11-06 21:48:23

标签: c# winforms path treeview directory

我发现在下面的代码中使用Path.GetFileName()可以正常运行,并为我提供了正确文件夹的名称,但是如果我使用Path.GetDirectoryName()则返回父代的名称(UserGeneratedContent)而是文件夹。当两个方法都传递给字符串相同的路径时,为什么会发生这种情况?为什么Path.GetFileName()可以处理目录?

当我使用Path.GetFileName()时,Treeview中节点的文本是它找到的文件夹的文本 - 这就是我想要发生的事情,但是如果我使用Path.GetDirectoryName()文本就是完整路径从每个节点的 @“UserGeneratedContent”开启。为什么会这样?

最后,我的代码可以改进吗?

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;
}

3 个答案:

答案 0 :(得分:3)

检查您的代码,您传递的路径不包含文件名,但路径的最后一部分是目录UserGeneratedContent。 Path.GetFileName返回"The characters after the last directory character in path",因此它返回最后一个目录名而不是文件名(您可以创建一个没有扩展名的文件)。当您在同一路径字符串上调用Path.GetDirectoryName()时,它会返回"Directory information for path"

检查此代码以查看我所指的内容:

假设您有目录"一个"在C分区和目录"两个"在目录"一个"和一个名为" three.txt"的文件中在目录"两个",当你执行这个代码时,它将产生:

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

directory将首先举行"两个"然后" 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;
    }

答案 1 :(得分:1)

首先,你如何区分指向文件的路径与指向目标的文件的区别?只是你不能,因为你可以创建一个名为file的文件(不包含点.和任何扩展名),你可以创建一个包含点folder.txt的文件夹。

那么如何实现确定路径是否指向文件的逻辑呢?

要回答您的问题方法GetFileNameGetDirectoryName,只需假设最后一个路径部分是文件名。

答案 2 :(得分:1)

仅仅因为Path.GetDirectoryName的MSDN cliams:

  

在大多数情况下,此方法返回的字符串包含所有字符串   路径中的字符,但不包括最后一个   DirectorySeparatorChar或AltDirectorySeparatorChar。

因此,如果参数是目录本身的路径,那么它只选择其父目录(如果有的话)。