Nếu bạn chỉ cố kiểm tra xem một chuỗi giữ tên / đường dẫn tệp của bạn có bất kỳ ký tự không hợp lệ nào không, thì phương pháp nhanh nhất tôi tìm thấy là sử dụng Split()
để chia tên tệp thành một mảng các phần bất cứ nơi nào có ký tự không hợp lệ. Nếu kết quả chỉ là một mảng 1, không có ký tự không hợp lệ. :-)
var nameToTest = "Best file name \"ever\".txt";
bool isInvalidName = nameToTest.Split(System.IO.Path.GetInvalidFileNameChars()).Length > 1;
var pathToTest = "C:\\My Folder <secrets>\\";
bool isInvalidPath = pathToTest.Split(System.IO.Path.GetInvalidPathChars()).Length > 1;
Tôi đã thử chạy phương thức này và các phương pháp khác được đề cập ở trên trên tên tệp / đường dẫn 1.000.000 lần trong LinqPad.
Sử dụng Split()
chỉ ~ 850ms.
Sử dụng Regex("[" + Regex.Escape(new string(System.IO.Path.GetInvalidPathChars())) + "]")
là khoảng 6 giây.
Các biểu thức chính quy phức tạp hơn NHIỀU tệ hơn, cũng như một số tùy chọn khác, như sử dụng các phương thức khác nhau trên Path
lớp để lấy tên tệp và để xác thực nội bộ của chúng thực hiện công việc (rất có thể là do xử lý ngoại lệ).
Cấp cho nó không thường xuyên bạn cần xác thực 1 triệu tên tệp, do đó, một lần lặp duy nhất là tốt cho hầu hết các phương thức này. Nhưng nó vẫn khá hiệu quả và hiệu quả nếu bạn chỉ tìm kiếm các ký tự không hợp lệ.