在 .NET(VB 或 C#)中有没有人知道从文件路径字符串中删除“头”目录的简单方法,这意味着如果我的路径看起来像这样:Directory1/Directory2/Directory3
我想Directory2/Directory3
回来。我知道有一些方法可以做到这一点,比如将它拆分成一个数组,然后从第二个元素开始将它全部连接起来,我只是觉得,这是一种非常低效的方法,我想知道是否有一个更好的方法来做到这一点。
问问题
198 次
4 回答
4
这取决于你在寻找什么。如果您知道事物的形式为dir1/dir2/dir3/dir4...
,那么您只需查找第一个/
,然后获取所有内容:
string dir = "dir1/dir2/dir3";
var pos = dir.IndexOf('/');
if (pos != -1)
{
result = dir.Substring(pos+1);
}
如果您还可以接受格式为c:\dir\dir\file.ext
or的完整路径名\\server\dir\dir\file.ext
,那么您可能需要确保首先将任何相对路径转换为完整路径。然后使用System.IO.Path
类中的方法提取驱动器或服务器名称,然后再使用上述IndexOf
技巧。
于 2013-02-12T19:01:28.650 回答
0
查看System.IO.Path类。对于这类事情,它有许多有用的方法。
例如,您可以使用它的GetPathRoot()
方法作为调用 String.Replace() 的一部分,如下所示:
public string RemoveHead(string path)
{
return path.Replace(Path.GetPathRoot(path), "");
}
我没有方便的 Visual Studio,因此可能需要进行一些调整来解释分隔符或驱动器字母,但它应该会给你这个想法。
于 2013-02-12T18:59:55.163 回答
0
如果你想要正确性和效率,
string path=@"dir1/dir2/dir3";
path=path.Substring(path.IndexOf(System.IO.Path.DirectorySeparatorChar)+1);
仅创建 1 个新字符串。
于 2013-02-12T19:30:28.047 回答
0
/// <summary>
/// Removes head.
/// </summary>
/// <param name="path">The path to drop head.</param>
/// <param name="retainSeparator">If to retain separator before next folder when deleting head.</param>
/// <returns>New path.</returns>
public static string GetPathWithoutHead (string path, bool retainSeparator = false)
{
if (path == null)
{
return path;
}
if (string.IsNullOrWhiteSpace (path))
{
throw new ArgumentException(path, "The path is not of a legal form.");
}
var root = System.IO.Path.GetPathRoot (path);
if (!string.IsNullOrEmpty(root) && !StartsWithAny(root,System.IO.Path.DirectorySeparatorChar,System.IO.Path.AltDirectorySeparatorChar))
{
return path.Remove(0,root.Length);
}
var sep = path.IndexOf(System.IO.Path.DirectorySeparatorChar);
var altSep = path.IndexOf(System.IO.Path.AltDirectorySeparatorChar);
var pos = MaxPositiveOrMinusOne (sep, altSep);
if (pos == -1)
{
return string.Empty;
}
if (pos == 0)
{
return GetPathWithoutHead(path.Substring(pos+1), retainSeparator);
}
var eatSeparator = !retainSeparator ? 1 : 0;
return path.Substring(pos+eatSeparator);
}
/// <summary>
/// Startses the with.
/// </summary>
/// <returns><c>true</c>, if with was startsed, <c>false</c> otherwise.</returns>
/// <param name="val">Value.</param>
/// <param name="maxLength">Max length.</param>
/// <param name="chars">Chars.</param>
private static bool StartsWithAny(string value, params char[] chars)
{
foreach (var c in chars)
{
if (value[0] == c)
{
return true;
}
}
return false;
}
/// <summary>
/// Maxs the positive or minus one.
/// </summary>
/// <returns>The positive or minus one.</returns>
/// <param name="val1">Val1.</param>
/// <param name="val2">Val2.</param>
private static int MaxPositiveOrMinusOne(int val1, int val2)
{
if (val1 < 0 && val2 < 0)
{
return -1;
}
return Math.Max(val1,val2: val2);
}
于 2015-10-09T07:50:24.117 回答