【问题标题】:How do I get the last part of this filepath?如何获取此文件路径的最后一部分?
【发布时间】:2012-08-30 14:47:55
【问题描述】:

我有一个遵循以下模式的文件路径:

Some\File\Path\Base\yyyy\MM\dd\HH\mm\Random8.3

我想提取 2012 年及以后的所有内容,但问题是虽然右侧是标准的,但每条记录的基本目录可能不同。

这里有两个例子:

  1. C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt
    返回:2012\08\27\18\35\wy32dm1q.qyt

  2. D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq
    返回:2012\08\27\18\36\tx84uwvr.puq

现在我正在获取LastIndexOf(Path.DirectorySeparatorChar) N 次以在 2012 年之前获取字符串的索引,然后从该索引获取子字符串。但是,我有一种感觉,也许有更好的方法?

【问题讨论】:

  • 我要撤回我的答案,我只是注意到您问题中的“及以后”。我会编写一个匹配正则表达式“\\\\d{4}\\”的函数,将以下 10 个字符转换为 DateTime,然后与 01-01-2012 进行比较。不幸的是,我缺乏正则表达式方面的专业知识,无法提供权威的答案。
  • 你的应用中有这个基本目录作为变量吗?
  • 您也可以使用正则表达式,但为什么呢?在 for 循环中拍打 LastIndexOf 并可能将其包装在自己的方法中就足够了。
  • @ajay_whiz:来自配置文件,可以随时更改,因为它只用于生成完整路径(部分结束路径需要根据约定计算)。

标签: c# io substring filepath


【解决方案1】:
    static void Main(string[] args)
    {
        Console.WriteLine(GetLastParts(@"D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq", @"\", 6));
        Console.ReadLine();
    }

    static string GetLastParts(string text, string separator, int count)
    {
        string[] parts = text.Split(new string[] { separator }, StringSplitOptions.None);
        return string.Join(separator, parts.Skip(parts.Count() - count).Take(count).ToArray());
    }

【讨论】:

  • Take 没用。一旦您跳过了parts.Length - count 部分,就只剩下 count 个部分了。
【解决方案2】:

这是一个使用正则表达式的解决方案,假设您要查找的格式始终包含 \yyyy\MM\dd\HH\mm。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(ExtractPath(@"C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt"));
        Console.WriteLine(ExtractPath(@"D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq"));
    }

    static string ExtractPath(string fullPath)
    {
        string regexconvention = String.Format(@"\d{{4}}\u{0:X4}(\d{{2}}\u{0:X4}){{4}}\w{{8}}.\w{{3}}", Convert.ToInt32(Path.DirectorySeparatorChar, CultureInfo.InvariantCulture));

        return Regex.Match(fullPath, regexconvention).Value;
    }
}

【讨论】:

  • 我喜欢正则表达式的想法,但它会返回前面的初始反斜杠。无论如何它不能返回,所以我可以在 Path.Combine 中正确使用它?
  • 当然!我已经更新了我的答案,所以它没有前导斜杠:)
  • 正则表达式应该使用 Path.DirectorySeparatorChar 组成,因为 OP 正在使用它(并且因为它是使用文件路径时做事的正确方法)。
  • @jrskillett:我修复了代码。您不能简单地将 Path.DirectorySeparatorChar 连接到字符串中,您需要转义该字符以防万一它是一个特殊字符......但是,您不能假设它总是会是反斜杠字符,即意味着转义它的唯一真正方法(如果它是任何特殊字符)是正则表达式 unicode 转义它。虽然我想知道字符是否应该转换为 Int32 或 UInt32?
  • @m-y:我在更新答案时对此感到疑惑,感谢您的提示。现在说得通了。
【解决方案3】:

一个 c# 解决方案是

string str = @"C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt";
string[] arr=str.Substring(str.IndexOf("2012")).Split(new char[]{'\\'});

【讨论】:

    【解决方案4】:

    我认为您当前的方法没有任何问题。这可能是这项工作的最佳选择。

    public string GetFilepath(int nth, string needle, string haystack) {
        int lastindex = haystack.Length;
    
        for (int i=nth; i>=0; i--)
            lastindex = haystack.LastIndexOf(needle, lastindex-1);
    
        return haystack.Substring(lastindex);
    }
    

    我会保持简单(KISS)。更易于调试/维护,速度可能是正则表达式变体的两倍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 2011-04-24
      • 2013-01-06
      • 2021-03-02
      相关资源
      最近更新 更多