.Net - Удалить точки с пути

Как я могу преобразовать "c:\foo \..\bar" в "c:\bar"?

Ответы

Ответ 2

Вы пробовали

string path = Path.GetFullPath(@"C:\foo\..\bar");

в С# с использованием класса System.IO.Path?

Ответ 3

Я считаю, что вы ищете Syetem.IO.Path, поскольку он предоставляет методы для решения нескольких проблем, связанных с универсальными путями, даже с интернет-маршрутами.

Ответ 4

Попробуйте System.IO.Path.GetFullPath(@ "c:\foo..\bar" )

Ответ 6

Я хотел сохранить относительный путь, не преобразовывая их в абсолютный путь, также я хотел бы поддерживать как окна, так и 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");
    }
}

Удалите дополнительные ссылки в верхней папке, если есть

Ответ 7

Не прямой ответ, но из вопроса, который я подозреваю, вы пытаетесь изобрести метод System.IO.Path.Combine(), Это должно устранить необходимость создания путей, подобных тем, которые вы задаете в целом.

Ответ 8

Если вы хотите сделать это самостоятельно, вы можете использовать этот код:

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 при использовании этого кода в реальном приложении