我发现在下面的代码中使用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;
}
答案 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
的文件夹。
那么如何实现确定路径是否指向文件的逻辑呢?
要回答您的问题方法GetFileName
和GetDirectoryName
,只需假设最后一个路径部分是文件名。
答案 2 :(得分:1)
仅仅因为Path.GetDirectoryName的MSDN cliams:
在大多数情况下,此方法返回的字符串包含所有字符串 路径中的字符,但不包括最后一个 DirectorySeparatorChar或AltDirectorySeparatorChar。
因此,如果参数是目录本身的路径,那么它只选择其父目录(如果有的话)。