Path.Combine когда-либо совершает сетевые вызовы в .net? - PullRequest
6 голосов
/ 15 февраля 2012

Кто-то, кого я знаю, утверждает, что это так, и я декомпилирую System.IO и смотрю в классе Path, и я не могу видеть, как он выполняет сетевые вызовы.Единственный подозреваемый находится в NormalizePath, где он вызывает PathHelper, который имеет вызовы в Win32Native.GetFullPathName.Я не знаю, что это делает.

Они также утверждают, что System.Uri делает сетевые вызовы при создании, что я считаю очень невероятным.Я просто не могу поверить, что это будет сделано, учитывая, насколько невероятно медленным это будет и насколько эти методы присущи.

Может ли кто-нибудь просветить меня?

Редактировать: Оказывается, Path.Combine(p) никогда не вызывает сеть, но Path.GetFullName(p) может.В сценарии, где у вас есть UNC-путь с коротким именем файла (например, "\\server\abcdef~1.txt"), он фактически вызовет сеть и попытается расширить путь, что откровенно поражает меня.

1 Ответ

8 голосов
/ 15 февраля 2012

Нет, метод Path.Combine просто выполняет необходимые манипуляции со строками для генерации допустимой строки пути с учетом разделителя пути.Он явно не проверяет, указали ли вы правильный путь, или правильное имя файла, или что-либо еще.

Справочный исходный код для .NET 4 доступен, есливам любопытно, и вы можете видеть, что работа выполняется полностью в управляемом коде, без собственных вызовов методов, и в основном:

return path1 + (path1.EndsWidth("\") ? "" : "\") + path2;

(Конечно, гораздо более надежной и гибкой, но этоидея.)

Точно так же конструкторы для класса Uri в основном выполняют синтаксический анализ строк (хотя на несколько порядков сложнее, чем вещи Path), но все же я не вижу сетевых вызовов, которые я вижу.

Вы также можете проверить это самостоятельно, запустив утилиту захвата пакетов, например Wireshark, при выполнении таких команд в приложении C #.

...