为什么解析路径名字符串不起作用

本文关键字:字符串 不起作用 路径名 为什么 | 更新日期: 2023-09-27 18:34:40

我有这个代码:

List<string> dirParts = new List<string>();
int index = 0;
for (int i = 0; i < dirName.Length; i++)
{
    index = dirName.IndexOf("/");
    string dironly = dirName.Substring(index, dirName.Length - index);
    dirParts.Add(dironly);
}

例如,dirName包含d/1/2/3/4/5

所以我需要在列表dirParts中,最终我将在索引 0 d 、索引 1 d/1 、索引 2 d/1/2 、索引 3 d/1/2/3 、索引 4 d/1/2/3/4 、索引 5 d/1/2/3/4/5

因此,当我查看列表时,它应该如下所示:

d
d/1
d/1/2
d/1/2/3
d/1/2/3/4
d/1/2/3/4/5

为什么解析路径名字符串不起作用

可能的实现:

  List<string> dirParts = new List<string>();
  int index = -1;
  while (true) {
    index = dirName.IndexOf("/", index + 1);
    if (index < 0) {
      dirParts.Add(dirName);
      break;
    }
    else
      dirParts.Add(dirName.Substring(0, index));
  }

除了这种路径操作最好留给库,以免您的代码在奇怪的异常目录名称上中断之外,您的代码会像它一样工作,因为您每次都查找相同的"/"。

您应该在最后一个之后搜索:

index = dirName.IndexOf("/", index+1);

如果你真的想这样做:

for (int i = 0; i < dirName.Length; i++) {
    index = dirName.IndexOf("/", index);
    if (index == -1)
        i = index = dirName.Length; //last one
    dirParts.Add(dirName.Substring(0, index++));
}

如果它是一个目录,我喜欢亲自使用Path库。唯一的问题是在目录名称中使用/而不是',因此您必须在插入之前调用.Replace

var orig = "d/1/2/3/4/5"; // Original string
List<String> dirParts = new List<String>(new[]{ orig }); // start out with list of original
// Get the directory below this one. (drop off last folder)
String part = Path.GetDirectoryName(orig);
while (!String.IsNullOrEmpty(part))
{
    // add it to the first entry in the list
    dirParts.Insert(0, part.Replace('''','/'));
    // get the next parent folder.
    part = Path.GetDirectoryName(part);
}
/* dirParts = [ "d", "d/1", "d/1/2", ... ] */

但是,如果您只是在寻找向下和肮脏的 LINQ 方法:

var orig = "d/1/2/3/4/5";
String[] parts = orig.Split('/');
var dirParts = Enumerable.Range(1, parts.Length)
  .Select (e => String.Join("/", parts.Take(e)));