2010-02-09 24 views
16

Tôi đã viết phương pháp nhỏ này để đạt được mục tiêu trong phân mục. Tuy nhiên, có cách làm hiệu quả hơn (đơn giản hơn) ? Tôi hy vọng điều này có thể giúp ai đó, những người sẽ tìm kiếm điều này như tôi đã làm.Xóa các ký tự không hợp lệ (không được phép, không hợp lệ) từ FileName (hoặc Thư mục, Thư mục, Tệp)

var fileName = new System.Text.StringBuilder(); 
fileName.Append("*Bad/\ :, Filename,? "); 
// get rid of invalid chars 
while (fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) > -1) 
{ 
    fileName = fileName.Remove(fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()), 1); 
} 

?

Trả lời

15

Hãy thử như sau

public string MakeValidFileName(string name) { 
    var builder = new StringBuilder(); 
    var invalid = System.IO.Path.GetInvalidFileNameChars(); 
    foreach (var cur in name) { 
    if (!invalid.Contains(cur)) { 
     builder.Append(cur); 
    } 
    } 
    return builder.ToString(); 
} 
+2

không hợp lệ.Contains (cur) dường như không hoạt động đối với tôi trong .NET 4. Có một thông báo "Không thể truy cập phương thức riêng tư tại đây". Đến với một ví dụ khác được đăng bên dưới. –

+0

Thêm sử dụng System.Linq lên trên cùng. – user565710

-1

Nếu bạn tìm kiếm "ngắn gọn" khi bạn nói đơn giản:

public string StripInvalidChars(string filename) { 
    return new String(
    filename.Except(System.IO.Path.GetInvalidFileNameChars()).ToArray() 
); 
} 

Điều đó nói rằng, tôi muốn đi với giải pháp JaredPar của. Nó có thể dễ đọc hơn (tùy thuộc vào khẩu vị, nền), cảm giác ruột của tôi là hiệu quả hơn (mặc dù tôi không chắc chắn bạn phải loại bỏ hàng chục ký tự không hợp lệ từ tên tệp có độ dài hạn chế) và sử dụng của một StringBuilder() có vẻ phù hợp hoàn hảo với ví dụ của bạn.

+3

Tôi không tin phương pháp Ngoại trừ làm những gì bạn muốn ở đây. Nó không thực sự hoạt động với các bản sao. "Phương thức [Ngoại lệ] trả về các phần tử đó trước tiên không xuất hiện trong giây. Nó cũng không trả lại các phần tử đó trong giây mà không xuất hiện trong lần đầu tiên." qua http://msdn.microsoft.com/en-us/library/bb300779.aspx – ChronoPositron

+0

@ChronoPositron: Khai sáng cho tôi: Vấn đề là gì? Tôi muốn "những yếu tố đầu tiên không xuất hiện trong giây" (tức là các ký tự không hợp lệ). Tôi không muốn "những yếu tố trong thứ hai mà không xuất hiện trong lần đầu tiên" (tức là các ký tự không hợp lệ không có mặt). –

+0

@Bejamin Podszun: Vấn đề là Ngoại trừ các hoạt động như một hoạt động thiết lập. Ví dụ: nếu tôi chuyển vào "aaabbb.txt" (tên tệp hợp lệ) cho hàm của bạn, giá trị kết quả là "ab.tx". Nó chỉ giữ sự xuất hiện đầu tiên của mỗi chữ cái, điều này làm cho nó loại bỏ nhiều hơn chỉ là các ký tự không hợp lệ; nó thay đổi kết quả mong đợi của hàm. – ChronoPositron

12

Một cách tiếp cận khác tương thích với .NET 4. Xem nhận xét của tôi ở trên giải thích sự cần thiết.

public static string ScrubFileName(string value) 
{ 
    var sb = new StringBuilder(value); 
    foreach (char item in Path.GetInvalidFileNameChars()) 
    { 
     sb.Replace(item.ToString(), ""); 
    } 
    return sb.ToString(); 
} 
+0

-1 vì không sử dụng 'StringBuilder' –

71

Tôi biết đây là một vài năm nhưng đây là một giải pháp khác để tham khảo.

public string GetSafeFilename(string filename) 
{ 

    return string.Join("_", filename.Split(Path.GetInvalidFileNameChars())); 

} 
+1

Vài năm sau, tuy nhiên, một giải pháp rất thông minh. Tính đến năm 2014, vẫn là cái tôi sẽ sử dụng, thay vì Regex.Replace. = D –

+0

Đúng. Giải pháp tốt nhất. Nó cũng cho thấy rằng nó trả tiền để đọc toàn bộ chủ đề (và để trả lời các câu hỏi cũ). Cảm ơn, Ceres. – Lara

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