2010-03-23 14 views
5

Có một số ký tự bị hạn chế (và thậm chí cả tên tệp đầy đủ, trong Windows), đối với tên tệp và thư mục. Điều này other question bao gồm chúng rồi.Làm cách nào để truy xuất các ký tự bị cấm đối với tên tệp, trong Java?

Có cách nào, trong Java, để truy xuất danh sách các ký tự bị cấm này, tùy thuộc vào hệ thống (giống như truy xuất các ký tự ngắt dòng)? Hay tôi chỉ có thể tự mình đặt danh sách, kiểm tra hệ thống?


Edit: Nhiều cơ bản về tình hình cụ thể của tôi, ngoài những câu hỏi chung.

Tôi sử dụng tên mặc định, đến từ một số dữ liệu (không kiểm soát thực sự nội dung của chúng) và tên này được gán cho JFileChooser làm tên tệp mặc định để sử dụng (với setSelectedFile()). Tuy nhiên, điều này cắt bớt bất cứ điều gì trước khi nhân vật không hợp lệ cuối cùng.

Những tên mặc định này đôi khi kết thúc bằng ngày ở định dạng "mm/dd/yy", chỉ để lại "yy", trong tên mặc định, vì "/" bị cấm. Như vậy, việc kiểm tra các ngoại lệ không thực sự là một tùy chọn ở đó, bởi vì bản thân tệp đó thậm chí không được tạo ra.

Chỉnh sửa bis: Hmm, điều đó khiến tôi nghĩ, nếu JFileChooser cắt bớt tên, nó có thể có quyền truy cập vào danh sách các ký tự như vậy, có thể thú vị để kiểm tra thêm.

Chỉnh sửa ter: Ok, kiểm tra nguồn từ JFileChooser hiển thị điều gì đó hoàn toàn đơn giản. Đối với trường văn bản, nó sử dụng file.getName(). Nó không thực sự kiểm tra các ký tự không hợp lệ, nó chỉ đơn giản là nó lấy "/" làm dấu tách đường dẫn và chỉ giữ phần cuối, "tên tệp thực". Các nhân vật bị cấm khác thực sự trải qua.

Trả lời

4

Khi nói đến việc đối phó với các nhân vật "cấm" Tôi thà làm quá thận và cấm/thay thế tất cả nhân vật "đặc biệt" mà có thể gây ra vấn đề trên bất kỳ hệ thống tập tin.

Ngay cả khi được cho phép về mặt kỹ thuật, đôi khi những nhân vật đó có thể gây ra sự kỳ quặc. Ví dụ, chúng tôi gặp sự cố khi tệp PDF được ghi (thành công) tới SAN, nhưng khi được phân phối qua máy chủ web từ vị trí đó, một số ký tự sẽ gây ra sự cố khi chúng tôi nhúng PDF vào một trang HTML đã được hiển thị trong Firefox. Nó là tốt nếu PDF đã được truy cập trực tiếp và nó đã được tốt trong trình duyệt khác. Một số lỗi lạ với cách Firefox và Adobe Reader tương tác.

Tóm tắt: nhân vật "đặc biệt" trong tên tập tin -> lỗi lạ chờ để xảy ra

Cuối cùng, cách duy nhất để chắc chắn là sử dụng một danh sách trắng.

+0

Xác định "ký tự đặc biệt". –

+0

+1 cho danh sách trắng –

+2

+1 Trên hầu hết các hệ thống tệp UNIX-y, các ký tự bị cấm chỉ là '/' và ký tự nul '\ 0'. –

-2

Hãy xem liên kết này để biết một số thông tin về cách tải xuống hệ điều hành mà ứng dụng đang chạy. Về cơ bản, bạn cần sử dụng System.getProperty ("os.name") và thực hiện equals() hoặc chứa() để tìm hiểu hệ điều hành.

Một điều cần biết mặc dù là hệ điều hành không nhất thiết phải cho bạn biết hệ thống tệp cơ bản đang được sử dụng, ví dụ máy Mac có thể đọc và ghi lên hệ thống tệp FAT32.

nguồn: http://www.mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/

2

Có một số "ký tự bị cấm" nhất định chỉ là một trong nhiều điều có thể xảy ra khi tạo tệp (những người khác là quyền truy cập và độ dài tên tệp và đường dẫn). Nó không thực sự có ý nghĩa để thử và bắt một số trong những đầu này khi có những người khác bạn không thể bắt cho đến khi bạn thực sự cố gắng để tạo ra các tập tin. Chỉ cần xử lý các ngoại lệ đúng cách.

+0

Thực tế là, tên này là tên mặc định được truy xuất từ ​​một số dữ liệu, vì vậy nó có thể chứa các ký tự không phù hợp với tên tệp. Cái mặc định này được gán cho một JFileChooser, và cái này cắt xén mọi thứ trước một ký tự bị cấm. Vì vậy, trong trường hợp này, tôi sẽ cần phải thay thế các ký tự này trước đây, sao cho ký tự mặc định có ý nghĩa. Trong bối cảnh này, không có ngoại lệ nào bị ném, vì tệp chưa được tạo. – Gnoupi

+1

Bạn không thể đặt mặc định an toàn? (giống như chỉ sử dụng ascii-7?). Mặt khác, bạn có thể: 1) chuyển ứng viên mặc định của bạn tới JFileChooser 2) yêu cầu chuỗi bị cắt ngắn (không hiển thị hộp thoại) 3) nếu tên tệp được trả về ngắn hơn, bạn biết char bị cấm ở đâu. – helios

+0

Phần của tôi với JFileChooser thực ra chỉ là vấn đề khi sử dụng dấu phân cách đường dẫn, như được mô tả trong câu hỏi của tôi. Đối với các ký tự bị cấm khác, JfileChooser không thực sự lọc bất cứ thứ gì, nó chỉ trả về những gì đã được nhập dưới dạng tên tệp. Giải pháp của bạn sau đó có lẽ là dễ nhất, kiểm tra đơn giản khi cố gắng thực sự viết tệp và xử lý ngoại lệ. – Gnoupi

2

Bạn đã cố gắng sử dụng File.getCanonicalPath và so sánh nó với tên file gốc (hoặc bất kỳ được lấy từ getAbsolutePath)?

Điều này sẽ không cung cấp cho bạn các ký tự thực, nhưng nó có thể giúp bạn xác định xem đây có phải là tên tệp hợp lệ trong hệ điều hành bạn đang chạy hay không.

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