【问题标题】:Remove the end of a string and merge it with another删除字符串的结尾并将其与另一个合并
【发布时间】:2018-01-09 12:31:15
【问题描述】:

我有两个字符串:

  1. C:\folder1\folder2\folder3

  2. folder3\folder4\file1.jpg

我想将这两个字符串结合起来给出一个完整的文件路径,但是使用时:

char[] charsToTrim = {'\\'};
var rootPathEdit = treeViewPath.TrimStart(charsToTrim);

它不起作用,你能给我一些建议吗?

编辑:

对不起,我发现不是很清楚,我想要合并的结果:

  1. C:\folder1\folder2\folder3

  2. folder3\folder4\file1.jpg

成为: C:\folder1\folder2\folder3\folder4\file1.jpg

因为文件路径的两半我在结尾和开头重叠。

【问题讨论】:

  • “它不起作用”是什么意思?
  • @AndyJ 在标题中詹姆斯说他想删除“字符串的结尾”。假设他希望#s 合并而在他的路径中没有两次 folder3,这不是重复的。但为此,我们需要詹姆斯提供更多信息。
  • 你应该更好地描述你想要完成的事情。你总是需要第一个路径的 parent 文件夹吗?或者你想匹配几个匹配的子文件夹?
  • @MightyBadaboom 够公平的。

标签: c# string


【解决方案1】:

使用Path.Combine 进行路径连接。

var finalPath = Path.Combine(firstPath, secondPath);

编辑:

由于真正的问题(在原始帖子中没有明确定义)是两个路径中都存在的重复文件夹,这是删除额外文件夹的一种方法:

var start = @"C:\folder1\folder2\folder3";
var end = @"folder3\folder4\file1.jpg";

var startArr = start.Split('\\');
var endArr = end.Split('\\');

var duplicateFolders = startArr.Intersect(endArr);
var final = Path.Combine(startArr.Concat(endArr.Except(duplicateFolders)).ToArray());

//... and some fix (because final path doesn't have backslash after :
final = final.Replace(":", @":\");

【讨论】:

  • 我没有 DV,但我认为这是因为您正在回答一个应该被标记为重复的问题。
  • @AndyJ 在我提出我的答案时没有被标记为重复 :)
  • 如果 end 是 var end = @"folder3\folder2\file1.jpg"; 怎么办?
  • @mjwills 这只是一个例子。从一开始就很糟糕,如果构建路径需要额外的努力,OP应该考虑重写很多代码。我没有任何意图编写更多代码或捕捉极端情况。
【解决方案2】:

不要为此使用字符串操作,因为有更好的方法,而且字符串操作不像下面的代码那样安全。

使用Directory.GetParent 从第一个路径获取父级(因为您在标题中说过要删除第一个字符串的结尾)。如果您不想,请跳过此部分。

var firstPath = Directory.GetParent(@"C:\folder1\folder2\folder3").ToString();
var secondPath = @"folder3\folder4\file1.jpg";

然后使用 Path.Combine 合并两条路径。

var result = Path.Combine(firstPath, secondPath);

或者当其中一条路径是相对路径时,您应该使用

var finalResult = Path.GetFullPath(result);

也是。

【讨论】:

  • 您可能还应该为completeness 包含Path.GetFullPath,以防其中一个路径是相对的。
  • 您好,感谢您的回复,我遇到的问题是我的两条路径重叠。第一个路径与第二个路径的开头具有相同的文件夹。我希望结果是: C\folder1\folder2\folder3\folder4\file1.jpg 使用路径组合我得到: C\folder1\folder2\folder3\folder3\folder4\file1.jpg
  • @JamesMorrish 这就是我写第一部分的原因:从第一个路径中删除最后一个文件夹;)
【解决方案3】:

这是一种可能的探索途径。

基本上,您将两个字符串拆分为\,然后将第一个字符串的最后一个元素与最后一个字符串的第一个元素进行比较。 如果它们完全相同,则去掉其中一个。

using System;
using System.IO;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var start = @"C:\folder1\folder2\folder3";
        var end = @"folder3\folder4\file1.jpg";

        var startArray = start.Split('\\');
        var endArray = end.Split('\\');

        var final = Path.Combine(start, end);
        var endOfStart = startArray.LastOrDefault();
        if (endOfStart  == endArray.FirstOrDefault())
        {
            final = Path.Combine(start.Substring(0, start.Length - (endOfStart ?? "").Length), end);
        }

        Console.WriteLine(final);
        Console.ReadLine();

    }
}

【讨论】:

  • 完美,这正是我想要实现的。非常感谢 +1
  • @JamesMorrish 因为您的附加信息清除了问题出在额外的文件夹3 中,所以我用稍微不同(如果更简单)的方法编辑了我的答案。
猜你喜欢
  • 2022-07-01
  • 2020-01-08
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2013-11-26
相关资源
最近更新 更多