Nếu tôi có một biến chuỗi có:tên thư mục Parse từ một filepath đầy đủ trong C#
"C:\temp\temp2\foo\bar.txt"
và tôi muốn để có được
"foo"
những gì tốt nhất là cách để làm điều này?
Nếu tôi có một biến chuỗi có:tên thư mục Parse từ một filepath đầy đủ trong C#
"C:\temp\temp2\foo\bar.txt"
và tôi muốn để có được
"foo"
những gì tốt nhất là cách để làm điều này?
Sử dụng:
new FileInfo(@"C:\temp\temp2\foo\bar.txt").Directory.Name
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.
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 ... –
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
Không Path.getDirectoryName làm chính xác những gì anh ta muốn? –
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);
+1 Tôi đang thực hiện gần như chính xác ... – SMUsamaShah
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.
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;
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.
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
@GuiSim: Không phải là tôi biết. –
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ế. –