namespace dy.net.storage { public static class StoragePath { public static string NormalizeRemote(string path) { if (string.IsNullOrWhiteSpace(path)) return "/"; var normalized = path.Replace('\\', '/').Trim(); var segments = normalized.Split('/', StringSplitOptions.RemoveEmptyEntries); if (segments.Any(x => x == "." || x == "..")) throw new ArgumentException("远端存储路径不能包含 . 或 ..", nameof(path)); return "/" + string.Join('/', segments); } public static string CombineRemote(params string[] parts) { return NormalizeRemote(string.Join('/', parts.Where(x => !string.IsNullOrWhiteSpace(x)))); } public static string DirectoryName(string path) { var normalized = NormalizeRemote(path); var lastSlash = normalized.LastIndexOf('/'); return lastSlash <= 0 ? "/" : normalized[..lastSlash]; } public static string Encode(string path) { var normalized = NormalizeRemote(path); return string.Join('/', normalized.Split('/').Select(Uri.EscapeDataString)); } } }