Путь. Комбинация и точечная нотация

Я ищу что-то похожее на метод Path.Combine, который поможет мне правильно объединить абсолютные и относительные пути. Например, я хочу

Path.Combine(@"c:\alpha\beta", @"..\gamma");

чтобы получить c:\alpha\gamma вместо c:\alpha\..\gamma как Path.Combine. Есть ли простой способ сделать это? Излишне говорить, что я также хочу, чтобы путь . path или несколько путей .. (например, ..\..\) работал правильно.

Ответ 1

Используйте Path.GetFullPath

string path = Path.Combine(@"c:\alpha\beta", @"..\gamma");
Console.WriteLine(Path.GetFullPath(path));

или DirectoryInfo класс:

string path = Path.Combine(@"c:\alpha\beta", @"..\gamma");
DirectoryInfo info = new DirectoryInfo(path);
Console.WriteLine(info.FullName);

Оба выводят:

c:\alpha\gamma

Ответ 2

Возможно, вы можете сделать Path.Combine, за которым следует Path.GetFullPath.

Ответ 3

вы можете использовать комбинацию из двух вызовов:

string path = Path.Combine(@"c:\alpha\beta", @"..\gamma");
string result = Path.GetFullPath(path);

И это должно дать вам результаты, которые вы ищете.

Ответ 4

Вы можете вызвать Path.GetFullPath, чтобы решить эту проблему.

Например, этот код:

string path = Path.Combine(@"c:\alpha\beta", @"..\gamma");
Console.WriteLine(path); 
path = Path.GetFullPath(path);
Console.WriteLine(path);

Будет напечатан:

c:\alpha\beta\..\gamma
c:\alpha\gamma

Ответ 5

Но похоже, что GetFullPath не всегда прав Попробуйте:

  Console.WriteLine(System.IO.Path.GetFullPath(@"\\machine\sharea\foldera\..\shareb\folderb"));
  Console.WriteLine(System.IO.Path.GetFullPath(@"\\machine\sharea\foldera\..\..\shareb\folderb"));

Они выводят тот же результат, кажется, что вы не можете переместить его, чтобы перейти на другую часть Правильный ответ для второго должен быть

\\ Мачинеа \shareb\folderb

но он дает

\\ machinea\sharea\shareb\folderb

для обоих