【问题标题】:C#: Need to remove last folder from file name pathC#:需要从文件名路径中删除最后一个文件夹
【发布时间】:2012-11-14 17:07:13
【问题描述】:

我正在从数据库中提取文件路径以用作文件源。 我需要从源路径中删除最后一个文件夹,然后我可以创建新文件夹以用作目标路径。

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

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

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

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

【问题讨论】:

标签: c#


【解决方案1】:

您要查找的是 Directory 类中的 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

【讨论】:

  • 这导致C:\Documents\MasterDocumentFolder
  • 不,它会生成一个对象,您可以将其呈现为您所说的内容,但它还包含 Parent 属性。
  • GetParent() 检索父目录。只有尾随 \ 它不能按预期工作。因此,您要么删除尾随的 \,要么使用 Parent 再增加一个。无论哪种情况,您的答案都不会产生正确的结果。
  • 为 DirectoryInfo.Parent 添加了一个使用示例,这是在 .net 中解决此问题的正确方法
  • @Jon 在 c# 中正确描述文件夹的唯一方法是在其末尾添加一个 \,不以反斜杠结尾的路径表示它是一个文件。但是,是否使用替代方法更新了解决方案
【解决方案2】:

这很丑,但有效

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

但是如果你的目录少于一级(驱动根目录),那么pathWithoutLastFolder将是null,所以你必须处理它。

【讨论】:

  • 除非他有完整路径(包括文件名),否则只需要一个 Path.GetDirecotyrName()
  • 我已经更新了我的示例路径,以说明为什么该方法不适合我。将 \\ 转换为 \ 是否有额外的步骤?
  • @Trikks 用 Reflector 看看 DirectoryInfo.Parent。你会感到惊讶 - 它使用string directoryName = Path.GetDirectoryName(fullPath);
  • 这表示有人已经为我们编写了该代码,不是吗? :)
  • @Trikks 好,同意 Directory.GetParent(path).Parent.FullName; 看起来更好,+1 为您的解决方案
【解决方案3】:

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("...\").Parent 在处理尾随 \'s 时的行为差异 - 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

【讨论】:

    【解决方案4】:

    这应该说明路径是文件还是目录

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

    【讨论】:

    • 您的表达式可能应该包含 DirectoryInfo.Exists?
    【解决方案5】:

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

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

    【讨论】:

    • .net 为此包含 System.IO 命名空间和 Path 对象。
    【解决方案6】:

    使用此方法,您可以通过 dirPath 创建 dir(如果 dir 不存在)并在需要时从 filePath 创建目录

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

    【讨论】:

      【解决方案7】:

      在 VB 中:

      Dim MyNewPath As String = StrReverse(Strings.Split(StrReverse(MyPath), "\", 2)(1))
      

      这适用于根目录,例如C:\MyPath,但对于裸文件夹会失败(未经验证)。

      显然,如果有附加文件,则需要不同的处理方式。

      【讨论】:

        猜你喜欢
        • 2014-12-11
        • 1970-01-01
        • 2018-12-02
        • 2014-12-30
        • 2018-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多