我已经发现,在下面的代码中使用 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
的文件夹。
那么,如何实现确定路径是否指向文件的逻辑?
回答您的问题方法GetFileName
和GetDirectoryName
只需假设最后一个路径部分是文件名。