Почему 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";

Другие вопросы по тегам