Почему путь работает, даже если он содержит @перед "\\",
Немного смущен. Я думал, что "@" в С# есть знак для интерпретации текста буквально, как @ "C:\Users...". Это позволяет избежать двойной обратной косой черты.
Но почему пути также работают, если они содержат двойную обратную косую черту и @?
Fe:
var temp = File.ReadAllText(@"C:\\Users\\text.txt").ToString(); // no error
В этом случае строка должна быть буквально "C:\\Users\\text.txt" - из-за предыдущего "@" - это не допустимый путь к окну (EDIT: Thats wrong, это допустимый путь, только исследователь не примет его - благодаря Muctadir Dinar), так почему это работает?
Заранее спасибо
Ответы
Ответ 1
Поскольку внутренне FileStream
во время инициализации вызывает iternal Path.NormalizePath(path, true, maxPathLength)
метод для нормализации переданного значения пути.
Вы можете вызвать этот метод с отражением (он имеет перегрузку, поэтому получение MethodInfo немного сложнее):
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});
Вывод:
C:\Users\text.txt
Ответ 2
Все это допустимые пути:
C:\Users\text.txt
C:\\Users\\text.txt
C:\\\Users\\\text.txt
C:\\\\Users\\\\text.txt
"\\"
представляет "\"
@"\"
представляет "\"
@"\\"
представляет "\\"
"\\\\"
представляет "\\"
Итак, ваш @"C:\\Users\\text.txt"
представляет "C:\\\\Users\\\\text.txt"
, который действителен
Вы можете вызвать Path.GetFullPath("")
, чтобы получить абсолютный путь.
например:
Console.WriteLine(@"C:\\Users\\text.txt");
Console.WriteLine(Path.GetFullPath(@"C:\\Users\\text.txt"));
Вывод:
C:\\Пользователи\\text.txt
C:\Users\text.txt
Ответ 3
что строка @ "C:\Users\text.txt" будет обрабатываться повторяющимися символами обратной косой черты, но система игнорирует эти повторяющиеся символы, рассматривая их как один.
например, этот код также будет работать:
string s=File.ReadAllText(@"C:\\\Users\\\text.txt");
или
string s=File.ReadAllText(@"C:\\\\\\\\\\\\Users\\\\\\\\\\\text.txt");
но это не очень хорошая идея.
если вы перебираете символы внутри этих строк пути, вы увидите, что на самом деле есть несколько символов обратной косой черты.
foreach (char c in @"C:\\\Users\\\text.txt") ...
Примечание: вам не следует указывать более одной обратной косой черты как разделитель папок, поскольку это поведение не является надежным и может быть изменено в будущих версиях операционной системы или .net framework...