c# - una - pasar datos del controlador a la vista mvc
¿Por qué funciona una ruta incluso si contiene una @ antes de "//"? (3)
Debido a que internamente FileStream
durante la inicialización llama al método Path.NormalizePath(path, true, maxPathLength)
para normalizar el valor de ruta pasado.
Puede llamar a este método con reflexión (tiene una sobrecarga, por lo que obtener MethodInfo es un poco complicado):
string path = @"C://Users//text.txt";
Type type = typeof(Path);
var flags = BindingFlags.Static | BindingFlags.NonPublic;
var binder = Type.DefaultBinder;
var types = new Type[] { typeof(string), typeof(bool), typeof(int) };
var modifiers = new ParameterModifier[0];
var normalize = type.GetMethod("NormalizePath", flags, binder, types, modifiers);
var result = normalize.Invoke(null, new object[] { path, true, 256});
Salida:
C: / Users / text.txt
Estoy un poco confundido. Pensé que "@" en c # es un signo para interpretar el texto literalmente como @ "C: / Users ...". Evita la necesidad de una doble barra invertida.
Pero, ¿por qué las rutas también funcionan si contienen barras invertidas dobles y @? Fe:
var temp = File.ReadAllText(@"C://Users//text.txt").ToString(); // no error
En ese caso, la cadena debe ser literalmente "C: // Users // text.txt", debido a la anterior "@", que no es una ruta válida de Windows (EDIT: Eso es incorrecto, es una ruta válida, solo explorador no lo aceptaré - gracias a Muctadir Dinar), entonces ¿por qué funciona esto?
Gracias por adelantado
Todos estos son caminos válidos:
C:/Users/text.txt
C://Users//text.txt
C:///Users///text.txt
C:////Users////text.txt
"//"
representa "/"
@"/"
representa "/"
@"//"
representa "//"
"////"
representa "//"
Así que su @"C://Users//text.txt"
representa "C:////Users////text.txt"
que es válido
Puede llamar a Path.GetFullPath("")
para obtener la ruta absoluta.
por ejemplo:
Console.WriteLine(@"C://Users//text.txt");
Console.WriteLine(Path.GetFullPath(@"C://Users//text.txt"));
Salida:
C: // Usuarios // texto.txt
C: / Users / text.txt
esa cadena @ "C: / Users / text.txt" se analizará con caracteres de barra invertida repetitivos, pero el sistema ignorará estos caracteres repetitivos al considerarlos como uno solo. por ejemplo, este código también funcionará:
string s=File.ReadAllText(@"C:///Users///text.txt");
o:
string s=File.ReadAllText(@"C:////////////Users///////////text.txt");
pero no es una buena idea hacerlo. Si recorres los caracteres dentro de esas cadenas de ruta, verás que en realidad hay varios caracteres de barra invertida.
foreach (char c in @"C:///Users///text.txt") ...
Nota: debe evitar especificar más de una barra invertida como separador de carpeta, ya que este comportamiento no es confiable y puede cambiarse en futuras versiones del sistema operativo o .net framework ...