Удаление диска (или сетевого имени) из пути в С#
Какой самый сжатый (но безопасный) способ удалить имя диска, сетевой путь и т.д. из абсолютного пути в С#?
Например, преобразование
\\networkmachine\foo\bar
или
C:\foo\bar
до \foo\bar
.
Кажется, есть много вопросов, которые уже были затронуты в вопросах пути, но я не мог найти то, что искал. Моя первая мысль, которая пришла на ум, заключалась в том, чтобы использовать Path.GetFullPath(), чтобы убедиться, что я действительно работаю с абсолютным путем, а затем просто использую регулярное выражение, чтобы найти первую косую черту, которая не рядом с другой. Однако использование регулярного выражения для манипуляции с путями кажется немного опасным.
Возможно, было бы разумнее получить буквенную/целевую сетевую машину /etc, преобразовать строки в Uri и запросить путь относительно диска/машины, а затем преобразовать обратно в строки? Или есть еще лучший подход?
Спасибо за ваше время!
Ответы
Ответ 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 ( "\\" ) );
Ответ 2
Вы просмотрели класс DirectoryInfo?
В частности, DirectoryInfo.Parent и DirectoryInfo.Root могут помочь при обнаружении корневого каталога, чтобы вы могли удалить его из FullName
Родитель:
http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.parent.aspx
Корень:
http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.root.aspx
Ответ 3
Я не знаю о безопасности, но я лично помещал его в строку, искал содержащиеся ( "\\" ) или ":" и удалял их из строки путем их подстановки.
Ответ 4
По запросу, вот как я это сделал:
Я написал помощника class PathHelper
, который делает то, что, как мне кажется, хочет знать айзер.
Вы можете найти библиотеку в CodeProject, функция, которую я бы использовал, - PathHelper.GetDriveOrShare
, аналогично:
var s = @"C:\foo\bar";
var withoutRoot = s.Substring( PathHelper.GetDriveOrShare(s).Length );