Ответ 1
string path = Path.GetFullPath("C:\\foo\\..\\bar"); // path = "C:\\bar"
Как я могу преобразовать "c:\foo \..\bar" в "c:\bar"?
string path = Path.GetFullPath("C:\\foo\\..\\bar"); // path = "C:\\bar"
Вы пробовали
string path = Path.GetFullPath(@"C:\foo\..\bar");
в С# с использованием класса System.IO.Path?
Я считаю, что вы ищете Syetem.IO.Path
, поскольку он предоставляет методы для решения нескольких проблем, связанных с универсальными путями, даже с интернет-маршрутами.
Попробуйте System.IO.Path.GetFullPath(@ "c:\foo..\bar" )
Используйте Path.GetFullPath
Я хотел сохранить относительный путь, не преобразовывая их в абсолютный путь, также я хотел бы поддерживать как окна, так и linux style linefeeds (\ или /), поэтому я придумал следующую формулу и тестовое приложение:
using System;
using System.Diagnostics;
using System.Text.RegularExpressions;
class Script
{
/// <summary>
/// Simplifies path, by removed upper folder references "folder\.." will be converted
/// </summary>
/// <param name="path">Path to simplify</param>
/// <returns>Related path</returns>
static String PathSimplify(String path)
{
while (true)
{
String newPath = new Regex(@"[^\\/]+(?<!\.\.)[\\/]\.\.[\\/]").Replace(path, "" );
if (newPath == path) break;
path = newPath;
}
return path;
}
[STAThread]
static public void Main(string[] args)
{
Debug.Assert(PathSimplify("x/x/../../xx/bbb") == "xx/bbb");
// Not a valid path reference, don't do anything.
Debug.Assert(PathSimplify(@"C:\X\\..\y") == @"C:\X\\..\y");
Debug.Assert(PathSimplify(@"C:\X\..\yy") == @"C:\yy");
Debug.Assert(PathSimplify(@"C:\X\..\y") == @"C:\y");
Debug.Assert(PathSimplify(@"c:\somefolder\") == @"c:\somefolder\");
Debug.Assert(PathSimplify(@"c:\somefolder\..\otherfolder") == @"c:\otherfolder");
Debug.Assert(PathSimplify("aaa/bbb") == "aaa/bbb");
}
}
Удалите дополнительные ссылки в верхней папке, если есть
Не прямой ответ, но из вопроса, который я подозреваю, вы пытаетесь изобрести метод System.IO.Path.Combine(), Это должно устранить необходимость создания путей, подобных тем, которые вы задаете в целом.
Если вы хотите сделать это самостоятельно, вы можете использовать этот код:
var normalizePathRegex = new Regex(@"\[^\]+\..");
var path = @"C:\lorem\..\ipsum"
var result = normalizePathRegex.Replace(unnormalizedPath, x => string.Empty);
URL-адреса и пути в стиле UNIX:
var normalizePathRegex = new Regex(@"/[^/]+/..");
var path = @"/lorem/../ipsum"
var result = normalizePathRegex.Replace(unnormalizedPath, x => string.Empty);
Примечание. Не забывайте использовать RegexOptions.Compiled при использовании этого кода в реальном приложении