2012-11-14 82 views
16

我从数据库拉文件路径以用作文件源。 我需要从源路径中删除最后一个文件夹,以便我可以创建新文件夹以用作目标路径。C#:需要从文件名路径中删除最后一个文件夹

示例源文件路径: \\\\ServerName\\Documents\\MasterDocumentFolder\\

我需要从字符串中删除的最后一个文件夹,并得到这样的: \\\\ServerName\\Documents\\

所以,我可以创建这样一个文件夹: \\\\ServerName\\Documents\\NewDocumentFolder1\\

编辑:我已更新我的示例路径,以显示为什么Path.GetDirectoryName()在这种情况下不起作用。

+0

你的字符串是否从数据库中回来,所有的斜线加倍?或者这正是你在调试器中观察到的(这是正常的)? –

+0

[从完整目录路径中删除一个目录]可能的重复(http://stackoverflow.com/questions/6098209/remove-one-directory-from-full-directory-path) –

回答

26

你所寻找的是在目录类的getParent()方法

string path = @"C:\Documents\MasterDocumentFolder\"; 
DirectoryInfo parentDir = Directory.GetParent(path); 
// or possibly 
DirectoryInfo parentDir = Directory.GetParent(path.EndsWith("\\") ? path : string.Concat(path, "\\")); 

// The result is available here 
var myParentDir = parentDir.Parent.FullName 
+0

结果在'C:\ Documents \ MasterDocumentFolder' –

+0

不,它会产生一个对象,您可以呈现您所陈述的内容,但它也包含Parent属性。 –

+1

'GetParent()'检索父目录。只有跟踪\它不像预期的那样工作。所以你要么拖放尾部,要么使用'Parent'再上一个。无论哪种情况,您的答案都不会产生正确的结果。 –

7

那难看,但作品

string path = @"C:\Documents\MasterDocumentFolder\file.any"; 
var lastFolder = Path.GetDirectoryName(path); 
var pathWithoutLastFolder = Path.GetDirectoryName(lastFolder); 

但如果你有(驱动器根目录)目录不到的水平,那么pathWithoutLastFoldernull,所以你必须处理它。

+0

除非他有完整路径(包括文件名),那么只需要一个'Path.GetDirecotyrName()'。 –

+0

我已更新我的示例路径,以显示为什么该方法不适合我。是否有额外的步骤将\\转换为\? – Mick

+0

这是不好的做法,请使用DirectoryInfo.Parent代替 –

1

您是否尝试过为每个“\”分割字符串,然后通过连接除最后一个元素之外的每个元素来重建新路径?

您还需要考虑原始路径位于根目录以及何时以反斜杠结束的情况。

+2

不会downvote,但这不是很好c#练习 –

+3

.net包括System.IO命名空间和路径因为这个原因的对象。 –

2

这应该考虑的路径是一个文件或目录

DirectoryInfo parent = null; 
if (File.Exists(path)) 
{ 
    parent = new FileInfo(path).Directory.Directory 
} 
if(Directory.Exists(path)) 
{ 
    parent = new DirectoryInfo(path).Directory; 
} 
+0

你的表达应该包括DirectoryInfo.Exists? –

0

System.IO.DirectoryInfo可能是最干净方式来完成你所要求的。

var path = "\\\\ServerName\\Documents\\MasterDocumentFolder\\"; 
string newPath = new DirectoryInfo(path).Parent.CreateSubdirectory("NewDocumentFolder1").FullName; 
Console.WriteLine(newPath.FullName); 
//> "\\ServerName\Documents\NewDocumentFolder1\" 

注意的DirectoryInfo不需要现有的或访问的目录:

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\Mn"); 
Console.WriteLine(dir.Exists); 
//> False 

但要确保它的存在是一个单元

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\Mn"); 
dir.Create(); 
Console.WriteLine(dir.Exists); 
//> True 

它也将做漂亮的东西像相对决心路径:

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\..\..\..\Mn"); 
Console.WriteLine(dir.FullName); 
//> C:\Asdf\Qwer\Mn 

关于修剪和附加斜杠的其他答案,请注意Directory.GetParent(“... \”)和DirectoryInfo(“... \”)之间的行为差​​异。一致:

Console.WriteLine(Directory.GetParent(@"C:\Temp\Test").FullName); 
//> C:\Temp 
Console.WriteLine(Directory.GetParent(@"C:\Temp\Test\").FullName); 
//> C:\Temp\Test 
Console.WriteLine(new DirectoryInfo(@"C:\Temp\Test").Parent.FullName); 
//> C:\Temp 
Console.WriteLine(new DirectoryInfo(@"C:\Temp\Test\").Parent.FullName); 
//> C:\Temp 

同样,为了避免处理结尾的斜杠,始终使用Path.Combine()来连接路径和文件名。它会正确处理的路径是否包含一个尾随\与否:

Console.WriteLine(Path.Combine(@"C:\Temp\Test\", "Test.txt")); 
//> C:\Temp\Test\Test.txt 
Console.WriteLine(Path.Combine(@"C:\Temp\Test", "Test.txt")); 
//> C:\Temp\Test\Test.txt 
Console.WriteLine(Path.Combine(@"C:\", "Temp", "Test", "Test.txt")); 
//> C:\Temp\Test\Test.txt 
0

有了这个方法,你可以通过dirPath创建目录(如果目录是不存在的),如果需要

private void CreateDirIfNotExist(string dirPath, bool removeFilename = false) 
     { 
      if (removeFilename) 
      { 
       dirPath = Directory.GetParent(dirPath).FullName; 
      } 

      if (!Directory.Exists(dirPath)) 
      { 
       Directory.CreateDirectory(dirPath); 
      } 
     } 
从文件路径创建目录
相关问题