为什么path.getFilename()返回正确文件夹的名称,而path.getDirectoryName()返回pa



我已经发现,在下面的代码中使用 Path.GetFileName()时,我打算使用正确的文件夹的名称,但是如果我使用 Path.GetDirectoryName(),它将返回父级的名称(usergeneratedContent)文件夹。当这两种方法都通过与字符串相同的路径传递时,为什么会发生这种情况?Path.GetFileName()为什么在目录上工作?

当我使用 Path.GetFileName()时,树景中的节点的文本是它找到的文件夹的文本 - 这是我想发生的事情,但是如果我使用 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;
}

检查您的代码,您正在通过不包含文件名但路径的最后一部分的路径目录usergeneratedContent。Path.GetFileName返回"路径中最后一个目录字符之后的字符",因此它重新调整了最后一个目录名称而不是文件名(您可以在没有扩展的情况下制作文件)。当您在同一路径字符串上调用Path.GetDirectoryName()时,它会返回"路径目录信息"。

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

假设您在c分区上有"一个"目录"一个",而目录"两个"目录"一个",以及一个名为" trix.txt"目录"两个"的文件,当您执行此代码时,它将产生:

string directory = Path.GetFileName(@"C:onetwo");
directory = Path.GetDirectoryName(@"C:onetwo");

directory将首先保持"两个",然后将" C: One"

保持
string filename = Path.GetFileName(@"C:onetwothree.txt");
directory = Path.GetDirectoryName(@"C:onetwothree.txt");

但是,现在,filename将保持" trix.txt",directory将保持" C: One 二"

编辑:这是在注释之后进行编辑。我将以这种方式修改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;
    }

简单地将其作为路径的msdn cliams.getDirectoryName:

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

因此,如果参数是通往目录本身的途径,则只需选择其父目录,如果有的话。

首先,您如何从指向指向目录的路径上指出的差异?简单地说,您不能因为可以创建一个名为file的文件(不包含点.和任何扩展名),并且可以创建一个包含DOT folder.txt的文件夹。

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

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

最新更新