2008-10-21 33 views
17

Làm cách nào để lấy tên tệp từ đường dẫn đầy đủ bằng cách sử dụng cụm từ thông dụng trong C#?Phân tích tên tệp từ đường dẫn đầy đủ bằng cách sử dụng cụm từ thông dụng trong C#

Giả sử tôi có đường dẫn đầy đủ C:\CoolDirectory\CoolSubdirectory\CoolFile.txt.

Làm cách nào để nhận ra CoolFile.txt bằng cách sử dụng hương vị .NET của cụm từ thông dụng? Tôi không thực sự tốt với các biểu thức thông thường, và người bạn RegEx của tôi và tôi không thể hình dung ra điều này.

Ngoài ra, trong quá trình cố gắng giải quyết vấn đề này, tôi nhận ra rằng tôi chỉ có thể sử dụng System.IO.Path.GetFileName, nhưng thực tế là tôi không thể hiểu được biểu thức chính quy chỉ khiến tôi không hài lòng và nó sẽ làm phiền tôi Tôi biết câu trả lời là gì.

+17

Thật tuyệt khi bạn muốn biết cách làm việc với biểu thức chính quy, nhưng để làm cho thế giới này trở thành một nơi tốt hơn, hãy hứa rằng bạn sẽ sử dụng Đường dẫn.* anyway :) – OregonGhost

+0

GetFileName có thể không phải là một tùy chọn nếu bạn đang làm việc với [Long Path] (http://bcl.codeplex.com/wikipage?title=Long%20Path) –

+0

Có những lý do và chống lại regex: http: //www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.html – benPearce

Trả lời

18
// using System.Text.RegularExpressions; 

/// <summary> 
/// Regular expression built for C# on: Tue, Oct 21, 2008, 02:34:30 PM 
/// Using Expresso Version: 3.0.2766, http://www.ultrapico.com 
/// 
/// A description of the regular expression: 
/// 
/// Any character that is NOT in this class: [\\], any number of repetitions 
/// End of line or string 
/// 
/// 
/// </summary> 
public static Regex regex = new Regex(
     @"[^\\]*$", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

UPDATE: loại bỏ bắt đầu dấu gạch chéo

+1

Bạn nhận ra rằng sẽ có được "\ CoolFile.txt" – dlamblin

+0

Tốt bắt, đã không vượt qua tâm trí của tôi rằng dấu gạch chéo không phải là có khi tôi thử nghiệm nó – bdukes

34

Tại sao bạn phải sử dụng cụm từ thông dụng? .NET có sẵn phương thức Path.GetFileName() được xây dựng riêng cho điều này, hoạt động trên các nền tảng và hệ thống tập tin.

+0

Bạn không đọc kỹ câu hỏi. Anh ấy biết GetFileName(), nhưng muốn biết làm thế nào để làm điều đó với reg ex. – Kon

+4

Khi tôi đăng câu trả lời, câu đó không có ở đó. –

+1

Sau đó, vui lòng bỏ qua tôi. :) – Kon

6

Dưới đây là một cách tiếp cận:

string filename = Regex.Match(filename, @".*\\([^\\]+$)").Groups[1].Value; 

Về cơ bản, nó phù hợp với tất cả mọi thứ giữa dấu chéo ngược cuối cùng và kết thúc của chuỗi. Tất nhiên, như bạn đã đề cập, bằng cách sử dụng Path.GetFileName() là dễ dàng hơn nhiều và sẽ xử lý rất nhiều trường hợp cạnh đó là một nỗi đau để xử lý với regex.

+0

+1 bởi vì tôi đã có thể giải quyết một Perl vấn đề regex với nó. Cảm ơn. –

1
\w+:\\(\w+\\)*(?<file>\w*\.\w*) 

Điều này rõ ràng sẽ cần mở rộng để bao gồm tất cả các ký tự đường dẫn, nhưng nhóm "tệp" có tên chứa tên tệp của bạn cho đường dẫn mẫu đã cho.

+0

chỉ tò mò, nhóm tiếp theo sẽ làm gì? (? \ w * \. \ W *). phải là (?:) – Artru

+0

@Artu: '(? \ w * \. \ W *)' là một nhóm chụp có tên. –

4

ngắn:

string filename = Regex.Match(fullpath, @"[^\\]*$").Value; 

Hoặc:

string filename = Regex.Match(fullpath, "[^\\"+System.IO.Path.PathSeparator+"]*$").Value; 

Without Regex:

string[] pathparts = fullpath.Split(new []{System.IO.Path.PathSeparator}); 
string file = pathparts[pathparts.Length-1]; 

Sự hỗ trợ thư viện chính thức mà bạn đề cập:

string file = System.IO.Path.GetFileName(fullpath); 
0

Bạn nên sử dụng lớp System.Path. Nó sẽ có nghĩa là bạn sẽ phải lo lắng về ít hơn nếu bạn quyết định hỗ trợ Mono/Linux (ví dụ của dlamblin lấy đường dẫn seperator vào tài khoản, nhưng bạn có thể nhận được một hệ điều hành lạ có đường dẫn lạ). Lớp System.Path cũng có thể kết hợp hai đường dẫn thành một. Vì vậy, ví dụ:

Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "My App Stuff"); 

sẽ giải quyết đến:

  • Windows: C: \ Documents and Settings \ [User] \ My Documents \ My App Stuff
  • Linux:/[User]/Nội dung ứng dụng của tôi
Các vấn đề liên quan