Newer
Older
Sunfish / src / Sunfish.Core / Ftp / FtpPath.cs
@Ivan Dominguez Ivan Dominguez 21 hours ago 1 KB 3.0
using Sunfish.Shares;

namespace Sunfish.Ftp;

/// <summary>Rutas de FTP: relativas a la carpeta actual o absolutas, con "." y "..".</summary>
internal static class FtpPath
{
    /// <summary>
    /// Combina la carpeta actual con el argumento de un comando. Acepta '/' y '\' como
    /// separador (algunos clientes de DOS y Windows usan '\'). ".." por encima de la raiz se
    /// queda en la raiz. Devuelve null si algun componente no es valido.
    /// </summary>
    public static List<string>? Resolve(IReadOnlyList<string> cwd, string? argument)
    {
        var result = new List<string>();
        string arg = argument ?? "";
        if (!(arg.StartsWith('/') || arg.StartsWith('\\')))
            result.AddRange(cwd);
        foreach (var part in arg.Split('/', '\\'))
        {
            if (part.Length == 0 || part == ".")
                continue;
            if (part == "..")
            {
                if (result.Count > 0)
                    result.RemoveAt(result.Count - 1);
                continue;
            }
            if (!PathRules.IsValidSegment(part))
                return null;
            result.Add(part);
        }
        return result;
    }

    public static string Format(IReadOnlyList<string> segments) => "/" + string.Join('/', segments);

    /// <summary>Comillas dobladas, como pide RFC 959 para la respuesta 257.</summary>
    public static string Quote(string path) => "\"" + path.Replace("\"", "\"\"") + "\"";
}