2014-09-11 4 views
0

У меня есть этот путьИзвлечение имен папок из пути

Path = C:\Users\cyberbemon\Documents\Development\Image tool\sources\AL001\2014-05-17\ImageTool\output.xml 

Я хочу, чтобы извлечь имена папок 2014-05-17 и AL001 Они будут позже использоваться в качестве имени файла для например: 140517-AL001.xml.

Проблема заключается в том, что пути являются динамическими, так что вместо 2014-05-17 и AL001 я мог бы что-то другое, как 2012-05-17 и AL401. Единственное, что остается то же самое ImageTool\output.xml

Так что в C# эквивалент GetParentof(GetParentof(\ImageTool\output.xml))

Глядя вокруг, я наткнулся на этот New DirectoryInfo(Path).Name это для меня возвращает ImageTool и что нет никакого смысла для меня.

+0

Как насчет начального пути 'C: \ Users \ cyberbemon \ Documents \ Development \ Image tool \ sources \' останется ли он таким же? – Habib

+0

У вас всегда есть «желаемый результат VALUE1/wishValue2/ImageTool/output.xml»? –

+0

'var first = Directory.GetParent (Directory.GetParent (путь) .FullName) .Name;' и 'var second = Directory.GetParent (Directory.GetParent (Directory.GetParent (путь) .FullName) .FullName) .Name; ' – Habib

ответ

7

Если вы можете гарантировать, что всегда есть 3 уровня каталогов затем

string p = @"C:\Users\cyberbemon\Documents\Development\Image tool\sources\AL001\2014-05-17\ImageTool\output.xml"; 
DirectoryInfo di = new DirectoryInfo(p); 
string p1 = di.Parent.Parent.Name; 
string p2 = di.Parent.Parent.Parent.Name; 

Родитель свойство класса DirectoryInfo еще один DirectoryInfo, так что это просто вопрос, чтобы разместить соответствующее количество рекурсивных вызовов Родителю

Следует отметить, что класс DirectoryInfo работает также, если вы передаете файл в его конструкторе. Если вы хотите придерживаться точной природы строки, то вы можете использовать класс FileInfo и восстановить родительский DirectoryInfo с помощью:

FileInfo fi = new FileInfo(p); 
string p1 = fi.Directory.Parent.Name; 
+2

'+ 1' Самый элегантный Стив очень простой и читаемый пример nice – MethodMan

+0

+1 Я собирался ответить на вопрос, используя метод Split, не знал об этом. –

+2

Остерегайтесь метода Split с использованием символа '\'. Он работает только на Win OS. Используйте Path.DirectorySeparatorChar, чтобы быть независимым от ОС. – Steve

0

Вы также можете просто разделить вашу строку на разделитель каталогов и перемещаться от конца массив до нужной вам точки.

 string[] pathParts = path.Split(new string[] { @"\" }, StringSplitOptions.RemoveEmptyEntries); 
0

Нарезка строка (не так элегантно, как с помощью функции ввода-вывода, хотя):

string Path = @"C:\Users\cyberbemon\Documents\Development\Image tool\sources\AL001\2014-05-17\ImageTool\output.xml"; 
string[] components = Path.Split('\\'); 
string p1 = components[components.Length - 2]; 
string p2 = components[components.Length - 3]; 
0

Вы можете использовать System.IO.Path.GetDirectoryName(path), чтобы получить каталог из файла/каталога. В вашем случае это будет

Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(path)))) 

Но было бы более элегантно создать рекурсивный метод, взять путь и уровень в параметрах и возвращает имя каталога.