Подтвердить что ты не робот

Почему путь работает, даже если он содержит @перед "\\",

Немного смущен. Я думал, что "@" в С# есть знак для интерпретации текста буквально, как @ "C:\Users...". Это позволяет избежать двойной обратной косой черты.

Но почему пути также работают, если они содержат двойную обратную косую черту и @? Fe:

var temp = File.ReadAllText(@"C:\\Users\\text.txt").ToString(); // no error

В этом случае строка должна быть буквально "C:\\Users\\text.txt" - из-за предыдущего "@" - это не допустимый путь к окну (EDIT: Thats wrong, это допустимый путь, только исследователь не примет его - благодаря Muctadir Dinar), так почему это работает?

Заранее спасибо

4b9b3361

Ответ 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...