Почему System.Uri интерпретирует две косые черты подряд как папку?
У меня появилась привычка всегда ставить косую черту в конце пути к моей папке, и это кажется нормой (например, макросы Visual Studio, такие как $(ProjectDir), всегда имеют косую черту). Кроме того, когда я добавляю относительный путь в конец существующего пути к папке, я всегда ставлю начальную косую черту на тот случай, если переданный мне путь к папке не имеет конечной косой черты (например, пакет Windows: set FULL_FILE_PATH=% Папка%\ путь \ к \ некоторых \ файла).
При этом, как правило, я получаю пути, которые выглядят так: C:\path\to\folder\\path\to\some\file.txt (обратите внимание на две обратные косые черты подряд). Кроме того, поскольку я использую структуру папок dev \ src dev \ include и dev \ script (где файлы.vcxproj и аналогичные находятся в папке скриптов), большинство моих путей добавляют в конце относительный путь с уровнями вверх некоторого макроса, такого как $(ProjectDir) (например, Включить dir = $(ProjectDir)\..\include\).
В следующем коде somePath02Uri и somePath03Uri возвращают (что я считаю) неверные результаты:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DotNet45SystemUriTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("We will now test the System.Uri constructor:\n");
// Output from Console.WriteLine is in the comment on the same line
String somePath01 = "C:\\some\\common\\..\\include\\";
Console.WriteLine("somePath01 = " + somePath01); // somePath01 = C:\some\common\..\include\
Uri somePath01Uri = new Uri(somePath01);
Console.WriteLine("somePath01Uri = " + somePath01Uri.ToString()); // somePath01Uri = file:///C:/some/include/
Console.WriteLine();
String somePath02 = "C:\\some\\common\\\\..\\include\\";
Console.WriteLine("somePath02 = " + somePath02); // somePath02 = C:\some\common\\..\include\
Uri somePath02Uri = new Uri(somePath02);
Console.WriteLine("somePath02Uri = " + somePath02Uri.ToString()); // somePath02Uri = file:///C:/some/common/include/
Console.WriteLine();
String somePath03 = "C:\\some\\common\\\\\\..\\include\\";
Console.WriteLine("somePath03 = " + somePath03); // somePath03 = C:\some\common\\\..\include\
Uri somePath03Uri = new Uri(somePath03);
Console.WriteLine("somePath03Uri = " + somePath03Uri.ToString()); // somePath03Uri = file:///C:/some/common//include/
Console.WriteLine();
}
}
}
Почему System.Uri интерпретирует две косые черты подряд как папку?
Почти забыл: если вы сталкиваетесь с этим, быстрое и грязное решение состоит в удалении двух обратных слешей подряд из строки перед созданием объекта Uri. Я сделал это, добавив .Replace("\\\\", "\\")
:
String somePath02 = "C:\\some\\common\\\\..\\include\\";
Console.WriteLine("somePath02 = " + somePath02); // somePath02 = C:\some\common\\..\include\
Uri somePath02Uri = new Uri(somePath02.Replace("\\\\", "\\"));
Console.WriteLine("somePath02Uri = " + somePath02Uri.ToString()); // somePath02Uri = file:///C:/some/include/
1 ответ
Две косые черты используются для не экранирования.
Например попробуйте это:
строка пути = "c:\test\html";
Когда вы компилируете этот фрагмент кода, вы получите ошибку "Нераспознанная escape-последовательность".
Но если вы добавите дополнительную косую черту, вы сообщаете компилятору, что экранирование не предусмотрено и строка должна быть проанализирована как есть.
строка пути = "c:\\test\\html";
Еще один интересный способ не избежать:
строка пути = @"c:\test\html";