2010-09-29 33 views
15

Tôi có dữ liệu đến từ trường nvarchar của cơ sở dữ liệu máy chủ SQL thông qua EF3.5. Chuỗi này được sử dụng để tạo Tên tệp và cần xóa các ký tự không hợp lệ và thử các tùy chọn sau nhưng không có tùy chọn nào hoạt động. Xin cho biết tại sao đây là một bí ẩn dễ hiểu? Tôi có làm gì sai không?C# Xóa các ký tự không hợp lệ khỏi tên tệp

Tôi đã sử dụng gần như tất cả các câu hỏi liên quan trên trang web này .. và hiện đang đăng câu hỏi tổng hợp từ tất cả các đề xuất/câu trả lời từ các câu hỏi tương tự khác.

UPD: Vấn đề không liên quan..Tất cả các tùy chọn này đều hoạt động. Vì vậy, đăng nó lên cộng đồng wiki.

public static string CleanFileName1(string filename) 
{    
    string file = filename;            
    file = string.Concat(file.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries)); 

    if (file.Length > 250) 
    { 
     file = file.Substring(0, 250); 
    } 
    return file; 
} 

public static string CleanFileName2(string filename) 
{ 
    var builder = new StringBuilder(); 
    var invalid = System.IO.Path.GetInvalidFileNameChars(); 
    foreach (var cur in filename) 
    { 
     if (!invalid.Contains(cur)) 
     { 
      builder.Append(cur); 
     } 
    } 
    return builder.ToString(); 
} 

public static string CleanFileName3(string filename) 
{          
    string regexSearch = string.Format("{0}{1}", 
     new string(System.IO.Path.GetInvalidFileNameChars()), 
     new string(System.IO.Path.GetInvalidPathChars())); 
    Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch))); 
    string file = r.Replace(filename, ""); 

    return file; 
}  

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

public static string CleanFileName5(string filename) 
{    
    string file = filename; 

    foreach (char c in System.IO.Path.GetInvalidFileNameChars()) 
    { 
     file = file.Replace(c, '_'); 
    }         
    return file; 
} 
+1

Ý anh là gì bởi "không ai trong số họ làm việc"? – RedFilter

+0

chuỗi trả về vẫn chứa các ký tự không hợp lệ .. không có ký tự không hợp lệ nào được System.IO.Path.GetInvalidFileNameChars() trả về. – Bhuvan

+0

Điều này được giải thích tốt nhất nếu bạn chỉ cho chúng ta một ví dụ về đầu vào không hoạt động. –

Trả lời

3

không chars không hợp lệ được trả về bởi System.IO.Path.GetInvalidFileNameChars() bị xóa. - Bhuvan 5 mins ago

Phương pháp đầu tiên bạn đăng công trình OK cho các nhân vật trong Path.GetInvalidFileNameChars(), ở đây là tại nơi làm việc:

static void Main(string[] args) 
{ 
    string input = "abc<def>ghi\\1234/5678|?9:*0"; 

    string output = CleanFileName1(input); 

    Console.WriteLine(output); // this prints: abcdefghi1234567890 

    Console.Read(); 
} 

Tôi cho rằng mặc dù rằng vấn đề của bạn là với một số ngôn ngữ cụ thể đặc biệt nhân vật. Bạn có thể thử để khắc phục vấn đề này bằng cách in ra các mã ASCII của ký tự trong chuỗi của bạn:

string stringFromDatabase = "/5678|?9:*0"; // here you get it from the database 

foreach (char c in stringFromDatabase.ToCharArray()) 
    Console.WriteLine((int)c); 

và thống nhất với bảng mã ASCII: http://www.asciitable.com/

tôi lại nghi ngờ rằng bạn sẽ thấy nhân vật với mã lớn hơn 128 và bạn nên loại trừ các mã đó khỏi chuỗi của mình.

+0

Điều này làm việc cho các chuỗi bình thường như vậy, nhưng không phải chuỗi đang đến từ một trường nvarchar của cơ sở dữ liệu. – Bhuvan

+0

Bạn có thể sao chép và dán chuỗi mà bạn nhận được từ cơ sở dữ liệu của mình dưới dạng nhận xét không? –

+0

"fbo kiểm tra nhà đầu tư 12/30/92" Trong chuỗi này tôi đang cố gắng để loại bỏ/và nó không loại bỏ chúng. Nhưng khi tôi cố gắng điều tương tự .. từ cửa sổ ngay lập tức .. bằng cách dán chỉ chuỗi. Nó loại bỏ những char. – Bhuvan

4

Hãy thử điều này

filename = Regex.Replace(filename, "[\/?:*""><|]+", "", RegexOptions.Compiled)

+0

@DJ .. Cùng một vấn đề với điều này quá ... hoạt động cho các chuỗi thường xuyên nhưng không cho các chuỗi đến từ nvarchar lĩnh vực cơ sở dữ liệu – Bhuvan

+0

'filename = Regex.Replace (tên tệp, @" [\ /?: ​​* ""><|] + "," ", RegexOptions.Compiled);' –

27

Đây là một chức năng tôi sử dụng trong một lớp học phổ biến tĩnh:

public static string RemoveInvalidFilePathCharacters(string filename, string replaceChar) 
{ 
    string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); 
    Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch))); 
    return r.Replace(filename, replaceChar); 
} 
Các vấn đề liên quan