如何在C#中从完整路径获取部分?

5
我有一个完整的路径,如下所示。
C:\Users\Ronny\Desktop\Sources\Danny\kawas\trunk\csharp\ImportME\XukMe\bin\Debug\DannyGoXuk.DTDs.xhtml-math-svg-flat.dtd

如何从整个部分中获取DTD的“部分”?

期望的输出:

C:\Users\Ronny\Desktop\Sources\Danny\kawas\trunk\csharp\ImportME\XukMe\bin\Debug‌​\DannyGoXuk.DTDs

我可以使用String的方法来完成这个任务吗?
如果可以,那么如何获取它呢?


4
请写下您想要的输出结果。听起来您想要文件名,但是您说的是“目录”。 - harpo
1
或许在DTD之后的点号应该换成反斜杠? - RichardOD
我在DannyGoXuk项目中添加了一个DTDs目录,其中包含所有文件。 - crazy_itgal
4
那路径不应该是 C:\Users\Ronny\Desktop\Sources\Danny\kawas\trunk\csharp\ImportME\XukMe\bin\Debug\DannyGoXuk\DTDs\xhtml-math-svg-flat.dtd 吗? - RichardOD
你的示例路径只能在'C:\Users\(...)\bin\Debug'(路径中的目录)和'DannyGoXuk.DTDs.xhtml-math-svg-flat.dtd'(文件名)之间进行拆分。你可以使用目录名称并连接'DannyGoXuk.DTDs'。 - Treb
显示剩余3条评论
11个回答

76

如果您需要整个路径,请使用System.IO.Path.GetDirectoryName(),如果只需要该文件夹的名称,请使用new DirectoryInfo(path).Parent.Name


"DTDs"在您发布的路径中不存在。看起来有一个名为"DannyGoXuk.DTDs.xhtml-math-svg-flat.dtd"的文件,但是该路径中的句点(.)不是有效的目录分隔符。您是不是想要"DannyGoXuk\DTDs\xhtml-math-svg-flat.dtd"

如果是这种情况,给出整个新路径,您需要类似下面的代码来返回DTDs文件夹中的文件列表:

string path = @"C:\Users\Ronny\Desktop\Sources\Danny\kawas\trunk\csharp\ImportME\XukMe\bin\Debug\DannyGoXuk\DTDs\xhtml-math-svg-flat.dtd";
string[] files = new DirectoryInfo(path).Parent.GetFiles();

在属性窗口中,我选择了嵌入资源为构建类型。

现在我们终于到达了问题的核心。当您选择“嵌入资源”时,该项将捆绑到可执行程序文件中。不再有直接的路径。相反,将构建类型设置为“内容”,并将“复制到输出目录”设置为“始终复制”或“仅在更改时复制”。


3
GetDirectoryName("C:\Mehrdad\Test") 返回 "C:\Mehrdad"。 - Mehrdad Afshari
Joel,你误解了我的意思。在VS2008的“解决方案资源管理器”中,我在dannyGoXuk prj下创建了名为DTDs的文件夹,并将所有文件放入其中。然后,在属性窗口中选择生成类型为嵌入式资源。现在当我尝试获取这些文件的完整路径时,我得到了上面发布的整个路径。但是我只想要DTDs目录的路径。我希望我已经表达清楚了。 - crazy_itgal

12

调用

System.IO.Path.GetFileName

使用完整的目录路径,获取路径的最后一部分作为目录名称。而GetDirectoryName返回其父目录的完整路径,这是不需要的。

如果你有一个文件名,只想要父目录的名称:

var directoryFullPath = Path.GetDirectoryName(@"C:\DTDs\mydtd.dtd");  // C:\DTDs
var directoryName = Path.GetFileName(directoryFullPath);  // DTDs

1
GetFileName() 将返回 "mydtd.dtd"。 - Joel Coehoorn
GetFileName会返回给定目录路径的最后一部分。你应该使用从GetDirectoryName获取的目录路径来调用它。我在编辑中解释了这一点。 - Mehrdad Afshari
我误解了你正在进行一个两步过程-以为你在原始字符串上调用GetFileName()。 - Joel Coehoorn
不,这并没有帮助。我正在从资源中获取文件,这些文件位于DannyGoXuk项目的DTDs文件夹下。因此,我正在使用foreach循环逐个获取这些文件,并希望获取DTDs目录。但是以上和以下的答案都没有帮助。 - crazy_itgal
@crazy_itgal:根据你在问题中提到的路径,你需要什么样的输出? - Mehrdad Afshari
我想要DTD文件所在的路径。例如: string path = C:\Users\Ronny\Desktop\Sources\Danny\kawas\trunk\csharp\ImportME\XukMe\bin\Debug\DannyGoXuk\DTDs 我需要这个“路径”... - crazy_itgal

9
您可以使用Directory从完整文件路径获取目录:
Directory.GetParent(path).FullName

7

编辑:在对此进行负评之前,请仔细阅读原帖的问题和所有评论。原帖标题的问题不完全是她想要的。我的回答给了她解决问题所需的内容,这也是她投票支持我的答案的原因。是的,Joel的回答如果是针对标题问题来回答是正确的。但是,在阅读她的评论后,你会发现这并不完全是她想要的。谢谢。

使用以下方法...

string strFullPath = @"C:\Users\Ronny\Desktop\Sources\Danny\kawas\trunk\csharp\ImportME\XukMe\bin\Debug\DannyGoXuk.DTDs.xhtml-math-svg-flat.dtd";
string strDirName; 
int intLocation, intLength;

intLength = strFullPath.Length;
intLocation = strFullPath.IndexOf("DTDs");

strDirName = strFullPath.Substring(0, intLocation); 

textBox2.Text = strDirName;

谢谢JimDel,但这部分给了我输出 "DTDs.xhtml-math-svg-flat.dtd"。我只是在寻找DTDs。我不想要它的文件xhtml-math-svg-flat.dtd。 - crazy_itgal
使用这个 Substring 替代...strDirName = strFullPath.Substring(0, intLocation); - JimDel
1
将您的文件放在c:\DTDsFolder\Sources...中,您会看到此脚本崩溃... - armandomiani

5

使用:

string dirName = new DirectoryInfo(fullPath).name;

5
System.IO.Path.GetFileName( System.IO.Path.GetDirectoryName( fullPath ) )

这将返回包含文件的文件夹名称。

对于

C:\windows\system32\user32.dll

这将返回

system32

我猜您想要这样做。

谢谢Harpo,你的答案有点接近我的问题,但是在你的答案中,使用了目录分隔符来获取“System32”作为目录,而在我的情况下,没有这样的“/”符号。我有一些来自资源的文件,这些文件位于DannyGoXuk项目下的DTDs文件夹中。因此,我正在使用foreach循环逐个获取这些文件,并希望获取DTDs目录。这个目录只是由DannyGoXuk.DTDs.xhtml-math-svg-flat.dtd给出的,其中xhtml-math-svg-flat.dtd是位于DannyGoXuk项目下DTDs目录中的一个dtd文件。 - crazy_itgal

2

您可以使用:

System.IO.Path.GetDirectoryName(path);

2
不要直接使用字符串操作。相反,使用 Path 类的 GetDirectoryName 方法:
System.IO.Path.GetDirectoryName(myPath);

2
你可以使用 Path 来进行文件路径操作。
Path.GetDirectoryName(myStr);

2

Use the FileInfo object...

FileInfo info = new FileInfo(@"C:\Users\Ronny\Desktop\Sources\Danny\kawas\trunk\csharp\ImportME\XukMe\bin\Debug\DannyGoXuk.DTDs.xhtml-math-svg-flat.dtd");
string directoryName = info.Directory.FullName;

文件甚至不必真实存在。

我遇到了这个错误: 无法将类型“System.IO.FileInfo”隐式转换为“System.Reflection.FieldInfo” 因为我正在使用资源文件。 - crazy_itgal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接