Có an toàn để chuyển đổi đường dẫn tệp Windows sang đường dẫn tệp Unix bằng một thay thế đơn giản không?


12

Vì vậy, ví dụ nói rằng tôi đã có nó để tất cả các tệp của tôi sẽ được chuyển từ máy windows sang máy unix như vậy: C:\test\myFile.txtto {somewhere}/test/myFile.txt(ký tự ổ đĩa không liên quan tại thời điểm này).

Hiện tại, thư viện tiện ích của chúng tôi do chúng tôi tự viết cung cấp một phương pháp thay thế đơn giản tất cả các dấu gạch chéo ngược bằng dấu gạch chéo về phía trước:

public String normalizePath(String path) {
   return path.replaceAll("\\", "/");
}

Dấu gạch chéo được dành riêng và không thể là một phần của tên tệp, do đó cấu trúc thư mục cần được giữ nguyên. Tuy nhiên, tôi không chắc chắn nếu có các biến chứng khác giữa các cửa sổ và đường dẫn unix mà tôi có thể cần phải lo lắng (ví dụ: tên không phải ascii, v.v.)


4
Chỉ cần để ý khoảng trắng - đặt dấu cách vào tên thư mục windows là phổ biến hơn nhiều so với tên thư mục unix. Cụ thể, "\ Chương trình tập tin" giúp tôi mọi lúc. Tùy thuộc vào cách bạn đang sử dụng các đường dẫn, bạn có thể phải thoát các khoảng trắng bằng "\".
Rob

1
@delnan vì đơn giản, hãy giới hạn phạm vi của các đường dẫn để loại trừ các đường dẫn biến.
MxLDevs

2
@MxyL Vấn đề không biến mất khi bạn mã hóa đường dẫn thay vì sử dụng biến môi trường. Nếu bạn chỉ muốn một con đường không nổ tung, bạn sẽ ổn thôi. Nếu bạn muốn có một đường dẫn có ý nghĩa hoặc nếu bạn muốn tương tác với phần mềm khác (hoặc kỳ vọng của người dùng ...), bạn cần các cuộc gọi phán xét theo đường dẫn.

1
@delnan Tôi chủ yếu tập trung vào việc tạo ra một con đường hợp lệ, nhưng đó là một điểm tốt. Các đường dẫn tôi đang chuyển đổi phải đủ đơn giản để chúng có ý nghĩa.
MxLDevs

3
Dấu gạch chéo ngược được phép trong tên tệp trên Linux, vì vậy thay thế dấu gạch chéo ngược trong đường dẫn Linux có thể thêm các thư mục không hợp lệ. Ví dụ, /foo\\barkhông tương đương với /foo/bartrên Linux.

Câu trả lời:


7

Có, nếu bạn chỉ thực hiện thay thế trên Windows, và tắt nó khi chạy trên các hệ thống khác.

Thực hiện thay thế trên các hệ thống giống Unix là sai\ký tự hợp lệ trong tên tệp hoặc thư mục trên các nền tảng giống Unix. Trên các nền tảng này, chỉ NUL/ bị cấm trong tên tệp và thư mục.

Ngoài ra, một số hàm API của Windows (hầu hết là các hàm cấp thấp hơn) không cho phép sử dụng dấu gạch chéo về phía trước - phải sử dụng dấu gạch chéo ngược .


4

Vâng, nhưng toàn bộ điều này là một điểm moot. Java chuyển đổi liền mạch các dấu gạch chéo về phía trước thành dấu gạch chéo ngược trên Windows. Bạn chỉ có thể sử dụng dấu gạch chéo về phía trước cho tất cả các đường dẫn được mã hóa cứng hoặc được lưu trữ trong cấu hình và nó sẽ hoạt động cho cả hai nền tảng.

Cá nhân, tôi luôn sử dụng dấu gạch chéo ngay cả trên Windows bởi vì nó là không phải là ký tự thoát. Cho dù đường dẫn thô nằm trong mã hoặc được đặt ngoài trong tệp thuộc tính, tôi mã hóa nó theo cùng một cách.

Thử nó! Điều này sẽ hoạt động trong Windows. Rõ ràng, thay đổi đường dẫn thực tế đến một cái gì đó tồn tại và người dùng của bạn có quyền đọc.

File f = new File("c:/some/path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong!");
}

Phần thưởng: bạn thậm chí có thể trộn các dấu gạch chéo trong cùng một đường dẫn!

File f = new File("c:/some\\path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong again!");
}

1
Nếu bạn đọc toàn bộ câu trả lời của tôi, bạn sẽ thấy nơi tôi nói rằng luôn luôn sử dụng trình phân tách tệp Unix sẽ hoạt động chính xác ở cả hai nơi, không cần chuyển đổi.

Câu hỏi nói rằng các tệp sẽ được chuyển và để mở cách lưu trữ tên tệp . Tôi đã thêm một bình luận cho câu hỏi yêu cầu làm rõ về điểm đó. Dựa trên phản hồi, tôi sẽ chỉnh sửa câu trả lời của mình cho phù hợp.

Rất có khả năng chương trình thực sự chứa trong đó một danh sách được nhập thủ công tất cả các tệp được truyền. Rất có khả năng một số cơ chế tự động đang được sử dụng để liệt kê các tệp. Đưa ra các tham số của vấn đề như đã nêu trong câu hỏi, cơ chế này cung cấp các đường dẫn kiểu Windows truyền thống. Trong hình thức hiện tại của nó, câu trả lời này là nói cho các OP để giải quyết một vấn đề khác nhau thay vì không nói với họ như thế nào hoặc thậm chí rằng họ nên chuyển họ vào các vấn đề khác nhau.
Eliah Kagan

Xin vui lòng đọc bình luận trước đây của tôi.

1
Windows nhận ra cả dấu gạch chéo và dấu gạch chéo ngược và đã được như vậy kể từ đầu MS-DOS. Tức là mọi nhân Microsoft OS đều có hỗ trợ dấu gạch chéo chuyển tiếp. COMMAND.COMThông dịch viên sớm có sở thích về thời gian chạy: bạn có thể định cấu hình dấu gạch chéo mà trình thông dịch sẽ sử dụng để in và phân tích cú pháp.
Kaz

3

Một sự phức tạp khác trên Windows là nó cũng hỗ trợ ký hiệu UNC cũng như các ký tự ổ đĩa truyền thống.

Một tập tin trên một máy chủ tập tin từ xa có thể được truy cập như \\server\sharename\path\filename.


1
Tôi nghĩ rằng đây là mối quan tâm duy nhất được trích dẫn cho đến nay thực sự là một vấn đề cho ứng dụng này. Nếu có các đường dẫn UNC liên quan, chúng không thể được chuyển đổi hữu ích thành đường dẫn kiểu Unix.
Jules

2

Không. Có nhiều thứ để suy nghĩ hơn là chỉ phân cách đường dẫn (điều "\ vs /"). Như Rob Y đề cập, có cách xử lý không gian và tần suất sử dụng Windows cao. Có hai nhân vật bất hợp pháp khác nhau trong hai môi trường. Có sự sẵn sàng của Unix để cho phép hầu hết mọi thứ khi thoát khỏi "\" hàng đầu. Có Windows sử dụng '"' để xử lý các không gian nhúng. Có sử dụng UCS-16 và Unix sử dụng ASCII hoặc UTF-8 của Windows.

vv , vv , vv

Nhưng , đối với nhiều ứng dụng có thể đặt các ràng buộc vào tên đường dẫn mà chúng cần thao tác, bạn thực sự có thể làm điều đó theo cách bạn đề xuất. Và nó sẽ hoạt động trong ít nhất một số lượng lớn các trường hợp, chỉ là không phải tất cả trong số họ.


1
Tôi không nghĩ những lo ngại này là hợp lệ cho câu hỏi được đặt ra Việc xử lý không gian là vấn đề giao diện người dùng; Các hệ thống Unix có thể xử lý các khoảng trắng trong tên tệp cũng như Windows có thể. Các ký tự không hợp lệ của Windows là một siêu ký tự của Unix. Không thể có bất kỳ dấu gạch chéo ngược nào trong tên tệp Windows (trừ dấu phân cách thư mục sẽ được chuyển đổi). Sử dụng dấu ngoặc kép cho các không gian nhúng là mối quan tâm ở cấp độ giao diện người dùng, không phải là vấn đề xử lý tệp. Mã chuyển đổi rõ ràng là bằng Java, do đó, nên tự động xử lý chuyển đổi UCS16-> UTF8.
Jules

-1

Mọi hệ điều hành của Microsoft, bắt đầu với MS-DOS, đều hiểu, ở cấp độ kernel, cả dấu gạch chéo và dấu gạch chéo ngược .

Do đó, trên Windows, bạn có thể chuyển đổi giữa chúng một cách tự do; cả hai đều có trạng thái như nhau là dải phân cách dành riêng. Trong bất kỳ đường dẫn hợp lệ nào, bạn có thể thay thế dấu gạch chéo ngược bằng dấu gạch chéo và ngược lại, mà không thay đổi ý nghĩa của nó, theo như liên quan đến kernel.

Trong các phiên bản đầu của DOS, Microsoft command.com thông dịch đã biến nó thành một ưu tiên có thể định cấu hình, dấu gạch chéo được sử dụng để hiển thị và phân tích các đường dẫn. Điều đó cuối cùng đã được gỡ bỏ.

Một số chương trình không gian người dùng trong Windows như, ồ, Windows shell ( explorer.exe) không thích dấu gạch chéo về phía trước. Đó chỉ là lập trình kém chất lượng trong các chương trình đó.


1
Mặc dù điều này là đúng, tôi không tin rằng nó hữu ích cho câu hỏi của OP (AIUI) liên quan đến việc chuyển đổi tên đường dẫn hiện có, vốn đã bao gồm dấu gạch chéo ngược trong chúng. Nó rất hữu ích cho việc viết mã cross-platform để nhận ra rằng bạn chỉ có thể sử dụng dấu gạch chéo và có họ làm việc trong hầu hết các tình huống, nhưng trong trường hợp này tôi không nghĩ rằng nó giúp.
Jules

@Jules OP đang chuyển tập tin từ Windows. Câu trả lời này giải thích rằng không có dấu gạch chéo ngược nào được thay thế. Chúng hoàn toàn không có trong hệ thống tập tin Windows. Tất cả các đường dẫn đều rõ ràng với dấu gạch chéo về phía trước (và Windows thậm chí hiểu nó).
Kaz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.