2010-04-20 14 views
8

Muszę usunąć ścieżkę pliku i uzyskać folder nadrzędny.Czy używam wyrażenia regularnego w tej ścieżce pliku?

Say moja ścieżka jest

\\ServerA\FolderA\FolderB\File.jpg 

Muszę

  1. Nazwa pliku = File.jog

  2. Folder to rezyduje w = FolderB

  3. i rodziców folder = FolderA

Zawsze muszę przejść o 2 poziomy w górę od miejsca, w którym znajduje się plik.

Czy istnieje prostszy sposób, czy też jest to zwykłe wyrażenie do zrobienia?

+0

Chciałbym odpowiedzieć tak samo jak Adam Robinson, ale Jon Skeet będzie również rade. I + 1 d każdemu z nich i powinien dobrze dla ciebie pracować. – McAden

Odpowiedz

21

FileInfo jest twoim przyjacielem:

using System; 
using System.IO; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     string file = @"\\ServerA\FolderA\FolderB\File.jpg"; 
     FileInfo fi = new FileInfo(file); 
     Console.WriteLine(fi.Name);     // Prints File.jpg 
     Console.WriteLine(fi.Directory.Name);  // Prints FolderB 
     Console.WriteLine(fi.Directory.Parent.Name); // Prints FolderA 
    } 
} 
+1

Właśnie dlatego nie odpowiadam na pytania C#, gdy myślę, że Jon Skeet jest w pobliżu, nie ma sposobu, by go pokonać. :-D –

2

Sprawdź klasę Katalog (lepszy wybór niż DirectoryInfo w tym przypadku). Robi wszystko, czego potrzebujesz. Nie powinieneś używać wyrażeń regularnych ani żadnej innej techniki analizy parsowania.

+0

DirectoryInfo jest świetny do uzyskania folderu i folderu nadrzędnego, ale chciał również uzyskać nazwę pliku. – TLiebe

+0

Ścieżka ma statyczną metodę prawidłowego pobrania nazwy pliku. –

6
string fileName = System.IO.Path.GetFileName(path); 
string parent = System.IO.Path.GetDirectoryName(path); 
string parentParent = System.IO.Directory.GetParent(parent); 
+0

+1 Byłem w trakcie pisania tego. –

2
var fi = new FileInfo(@"\\ServerA\FolderA\FolderB\File.jpg"); 
fi.Name 
fi.Directory.Name 
fi.Directory.Parent.Name 
+0

+1 - znacznie czystsze rozwiązanie niż moje – house9

0

Jeśli wiesz na pewno, że jesteś zawsze do czynienia z plikiem i dwóch katalogów, spróbuj użyć dzielone: ​​

string s = @"\\ServerA\FolderA\FolderB\File.jpg"; 
string[] parts = s.Split('\'); // might need '\\' 
string file = parts[parts.Length]; 
string parentDir = parts[parts.Length - 1]; 
string grandParentDir = parts[parts.Length - 2]; 
+0

Istnieją funkcje użytkowe, które są o wiele mniej kruche. Nie parsuj (ani nie konstruuj) łańcuchów znaków. Jest to również strasznie nieczytelne. –

0

Masz kilka opcji, aby to zrobić, które używają rzeczywistych obiektów .net zamiast regex.

Można użyć FileInfo:

FileInfo fileInfo = new FileInfo(@"\\ServerA\FolderA\FolderB\File.jpg"); 
fileInfo.Name //will give you the file name; 
DirectoryInfo directory = fileInfo.Directory; //will give you the parent folder of the file (FolderB); 
directory.Parent; //will give you this directories parent folder (FolderA) 
Powiązane problemy