【问题标题】:Why does Path.GetFileName() return the name of the correct folder, but Path.GetDirectoryName() returns it parent folder?为什么 Path.GetFileName() 返回正确文件夹的名称,但 Path.GetDirectoryName() 返回父文件夹?
【发布时间】:2012-10-26 22:23:39
【问题描述】:

我发现在下面的代码中使用 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;
}

【问题讨论】:

  • 可能是错字?他们都调用同一个函数..
  • @Simon Whithead - 是的错字,现在修正。感谢您指出。
  • 你能在某处弹出path 的示例值吗?
  • 路径名不明确。取一个像c:\foo\bar 这样的路径名。那是一个 目录 名称栏吗?还是 foo 目录中名为 bar 的 file ?找出答案的唯一方法是点击磁盘并检查。 Path 类拒绝这样做。

标签: c# winforms path treeview directory


【解决方案1】:

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

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

假设你在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”

编辑:这是在 cmets 之后的稍后编辑。我会这样修改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;
    }

【讨论】:

  • @Nick,感谢您简洁明了的回答。我现在明白发生了什么。 Path.GetFileName() 完成了工作,但我宁愿使用 Path.GetDirectoryName() 因为它是我正在搜索的文件夹。我不确定如何修改我的代码以使用后一种方法。我无法对路径进行硬编码,因为我想让用户使用他们自己选择的名称创建一个文件夹。你会怎么做?再次感谢您的帮助。
  • 如果您愿意,可以使用此代码:string dir = "C:\\A\\B\\D"; dir = dir.TrimEnd(new char[] { '\\' }); int index = dir.LastIndexOf('\\'); dir = dir.Substring(index + 1);
  • 尼克,我有点困惑。对于初学者,我不知道从驱动器根目录到“UserGeneratedContent”的绝对路径。我正在开发一个可移植的、独立的、单一的 *.exe 应用程序,它可以位于硬盘或 USB 闪存驱动器的任何位置。目前我想要的文件夹的路径是......\UserGeneratedContent\This is the folder I want as my Root node\Next folder\etc.
  • @TheThing 所以你想找到 UserGeneratedContent 文件夹的完整路径而不知道它在哪里?我说对了吗?
  • @TheThing 该文件夹是在您的程序 .exe 文件旁边还是可以在磁盘上的任何位置?
【解决方案2】:

仅仅是因为 MSDN 为Path.GetDirectoryName 申请:

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

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

【讨论】:

    【解决方案3】:

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

    那么你将如何实现判断路径是否指向文件的逻辑呢?

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

    【讨论】:

    • 这是一个很好的观点。当然必须有另一种(并且可能更容易)的方法来确定路径是否指向文件夹或目录(可能是 contentType?)至少,我想你可以提取一些应该只适用于文件而不适用于目录的方法并捕获空引用异常,也许?
    • 您当然假设给定路径存在,如果不存在?是该文件丢失还是目录丢失:)。有问题的这两种方法不关心路径是否存在,他们不会检查它,也不应该检查它。所以我们所拥有的只是一个字符串,调用者说它是通往某事的路径,所以假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2018-05-08
    相关资源
    最近更新 更多