net example combine asp .net string path io concatenation

.net - example - path combine c# asp net



¿Cómo se puede usar Path.Combine con más de dos argumentos? (3)

El lado de la eficiencia de las cosas no es el problema de la OMI, es el lado de la usabilidad de las cosas. Personalmente creo que debería haber una sobrecarga de:

Combine(string first, string second, string third, params string[] others)

Path.Combine("foo", "bar") tener al menos tres para evitar que entre en conflicto con la versión existente de dos parámetros si solo escribe Path.Combine("foo", "bar") pero sin duda ayudaría a Path.Combine("foo", "bar") código. ¿Por qué no abrir una solicitud de función en Connect ?

Por supuesto, puede implementarlo usted mismo (y en otra clase el número de parámetros no importa mucho):

public static string CombinePaths(string first, params string[] others) { // Put error checking in here :) string path = first; foreach (string section in others) { path = Path.Combine(path, section); } return path; }

Me sorprende que no haya una sobrecarga que pueda tomar una matriz de cadenas. De todos modos, ¿cuál es la mejor manera de evitar el anidamiento de llamadas a Path.Combine?

pathValue = Path.Combine(path1, Path.Combine(path2, Path.Combine(path3, path4)))

Esto parece ineficiente ya que da como resultado que se creen cuatro cadenas nuevas solo para obtener una.


Es bastante sencillo implementarlo usted mismo:

public string Combine(params string[] paths) { char[] pathSeparators = new char[] { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar, Path.VolumeSeparatorChar }; if(paths == null) throw new ArgumentNullException("paths"); if(paths.Length == 1) return paths[0]; StringBuilder pathBuilder = new StringBuilder(); foreach(string path in paths) { if(Path.IsPathRooted(path)) pathBuilder = new StringBuilder(path); else { char last = pathBuilder.Length > 0 ? pathBuilder[pathBuilder.Length - 1] : path[path.Length - 1]; if(Array.IndexOf(pathSeparators, last) == -1) pathBuilder.Append(Path.DirectorySeparatorChar); pathBuilder.Append(path); } // else } // foreach return pathBuilder.ToString(); } [Test()] public void CombinePaths() { string result = Combine(@"C:/Program Files/", @"Microsoft.NET", @"ADOMD.NET/", "90", "msadomdx.dll"); Assert.AreEqual(@"C:/Program Files/Microsoft.NET/ADOMD.NET/90/msadomdx.dll", result); }


Si ya tiene una matriz o un <Enumerable <T>, entonces podría hacer esto en una línea ...

// I''m assuming that you''ve got an array or IEnumerable<T> from somewhere var paths = new string[] { path1, path2, path3, path4, path5, path6 }; string result = paths.Aggregate(Path.Combine);

Si no, escribe tu propio método de extensión a la cadena ...

public static class PathExtension { public static string CombinePathWith(this string path1, string path2) { return Path.Combine(path1, path2); } }

... eso te permitiría encadenar estos como este ...

string result = path1.CombinePathWith(path2) .CombinePathWith(path3) .CombinePathWith(path4) .CombinePathWith(path5) .CombinePathWith(path6);