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

Удаление диска (или сетевого имени) из пути в С#

Какой самый сжатый (но безопасный) способ удалить имя диска, сетевой путь и т.д. из абсолютного пути в С#?

Например, преобразование

\\networkmachine\foo\bar

или

C:\foo\bar

до \foo\bar.

Кажется, есть много вопросов, которые уже были затронуты в вопросах пути, но я не мог найти то, что искал. Моя первая мысль, которая пришла на ум, заключалась в том, чтобы использовать Path.GetFullPath(), чтобы убедиться, что я действительно работаю с абсолютным путем, а затем просто использую регулярное выражение, чтобы найти первую косую черту, которая не рядом с другой. Однако использование регулярного выражения для манипуляции с путями кажется немного опасным.

Возможно, было бы разумнее получить буквенную/целевую сетевую машину /etc, преобразовать строки в Uri и запросить путь относительно диска/машины, а затем преобразовать обратно в строки? Или есть еще лучший подход?

Спасибо за ваше время!

4b9b3361

Ответ 1

использование

string MyPath = @""; // \\networkmachine\foo\bar OR C:\foo\bar
string MyPathWithoutDriveOrNetworkShare = MyPath.Substring (Path.GetPathRoot(MyPath).Length);

Результат для C:\foo\bar будет foo\bar, а для \\networkmachine\foo\bar будет bar.

Для справки MSDN см. http://msdn.microsoft.com/en-us/library/system.io.path.getpathroot.aspx

EDIT - согласно комментариям:

С помощью "string voodoo" (который не является сжатым IMHO и, следовательно, НЕ рекомендуется), вы можете сделать это:

if ( ( MyPath.IndexOf (":") == 1 ) || ( MyPath.IndexOf ( "\\\\" ) == 0 ) )
     { MyPathWithoutDriveOrNetworkShare = MyPath.Substring (2); }
if ( MyPathWithoutDriveOrNetworkShare.IndexOf ( "\\" ) > 0 )
     MyPathWithoutDriveOrNetworkShare = MyPathWithoutDriveOrNetworkShare.Substring ( MyPathWithoutDriveOrNetworkShare.IndexOf ( "\\" ) );  

Ответ 3

Я не знаю о безопасности, но я лично помещал его в строку, искал содержащиеся ( "\\" ) или ":" и удалял их из строки путем их подстановки.

Ответ 4

По запросу, вот как я это сделал:

Я написал помощника class PathHelper, который делает то, что, как мне кажется, хочет знать айзер.

Вы можете найти библиотеку в CodeProject, функция, которую я бы использовал, - PathHelper.GetDriveOrShare, аналогично:

var s = @"C:\foo\bar";
var withoutRoot = s.Substring( PathHelper.GetDriveOrShare(s).Length );