2009-03-19 26 views

Trả lời

71

Sử dụng:

new FileInfo(@"C:\temp\temp2\foo\bar.txt").Directory.Name 
+3

Theo http://msdn.microsoft.com/en-us/library/system.io.fileinfo.fileinfo.aspx, hàm tạo FileInfo có thể ném nếu người gọi không có quyền cần thiết. Có một thay thế mà sẽ chỉ phân tích cú pháp chuỗi mà không có bất kỳ IO? – GuiSim

+0

@GuiSim: Không phải là tôi biết. –

+10

Trong trường hợp ai đó cần đường dẫn thư mục đầy đủ, sử dụng 'FileInfo mới (@" C: \ temp \ temp2 \ foo \ bar.txt "). DirectoryName' thay thế. –

7

Viễn được nó cho tôi để không đồng ý với Skeet, nhưng tôi đã luôn luôn sử dụng

Path.GetFileNameWithoutExtension(@"C:\temp\temp2\foo\bar.txt") 

Tôi nghi ngờ rằng FileInfo thực sự chạm vào hệ thống tập tin để có được nó là thông tin , như tôi mong đợi rằng GetFileNameWithoutExtension chỉ hoạt động chuỗi - vì vậy hiệu suất của một trong những khác có thể là tốt hơn.

+0

Có một sự khác biệt nhỏ trong kết quả ở đây ... Tôi nghĩ rằng cách tiếp cận của bạn trả về "bar" khi câu hỏi được hỏi làm thế nào để có được "foo" thư mục chứa tập tin ... –

+7

Tôi đã học được hai điều hôm nay ... Đọc câu hỏi và không bao giờ không đồng ý với Skeet. – Handleman

+2

Không Path.getDirectoryName làm chính xác những gì anh ta muốn? –

2

Tôi đã có một dịp khi tôi đang lặp qua các thư mục con mẹ

string[] years = Directory.GetDirectories(ROOT); 
foreach (var year in years) 
{ 
    DirectoryInfo info = new DirectoryInfo(year); 
    Console.WriteLine(info.Name); 
    Console.WriteLine(year); 
    //Month directories 
    string[] months = Directory.GetDirectories(year); 
    foreach (var month in months) 
    { 
     Console.WriteLine(month); 
     //Day directories 
     string[] days = Directory.GetDirectories(month); 
     foreach (var day in days) 
     { 
      //checkes the files in the days 
      Console.WriteLine(day); 
      string[] files = Directory.GetFiles(day); 
      foreach (var file in files) 
      { 
       Console.WriteLine(file);        
      } 
     } 
    } 
} 

sử dụng dòng này tôi đã có thể để có được chỉ có tên thư mục hiện

DirectoryInfo info = new DirectoryInfo(year); 
Console.WriteLine(info.Name); 
+0

+1 Tôi đang thực hiện gần như chính xác ... – SMUsamaShah

1

Nó sẽ phụ thuộc vào cách bạn muốn xử lý dữ liệu, nhưng một tùy chọn khác là sử dụng String.Split.

string myStr = @"C:\foo\bar.txt"; 
string[] paths = myStr.Split('\\'); 
string dir = paths[paths.Length - 2]; //returns "foo" 

Điều này không kiểm tra một loạt ngoại lệ, nhưng bạn có ý tưởng.

+0

Điều đó sẽ không thành công trên Linux. – JensG

+0

Path.DirectorySeparatorChar – Ruudjah

7

Tôi nghĩ rằng giải pháp đơn giản nhất là

 
DirectoryInfo dinfo = new DirectoryInfo(path); 

string folderName= dinfo.Parent.Name; 
3

Dựa trên đề nghị Handleman, bạn có thể làm:

Path.GetFileName(Path.GetDirectoryName(path)) 

này không chạm vào hệ thống tập tin (không giống như FileInfo), và sẽ làm những gì cần thiết . Điều này sẽ làm việc với các thư mục bởi vì, như các MSDN nói:

giá trị Return: Các nhân vật sau khi nhân vật thư mục cuối cùng trong đường dẫn. Nếu ký tự cuối cùng của của đường dẫn là một ký tự phân cách thư mục hoặc khối lượng, phương thức trả về String.Empty. Nếu đường dẫn là null, phương thức này trả về null.

Ngoài ra, hãy xem reference source xác nhận rằng GetFilename không quan tâm nếu đường dẫn đi qua là một tệp hoặc thư mục: nó chỉ thực hiện thao tác chuỗi thuần túy.

Các vấn đề liên quan