4

我发现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;
}
4

3 回答 3

3

检查您的代码,您传递的路径不包含文件名,但路径的最后一部分是目录 UserGeneratedContent。Path.GetFileName返回“路径中最后一个目录字符之后的字符”,因此它返回最后一个目录名称而不是文件名(您可以制作没有扩展名的文件)。当您调用 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将首先保留“两个”,然后是“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

只是因为 MSDN cliams 为Path.GetDirectoryName

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

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

于 2012-11-06T22:01:05.410 回答
1

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

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

回答您的问题方法GetFileNameGetDirectoryName简单地假设最后一个路径部分是文件名。

于 2012-11-06T21:58:18.643 回答