Apakah aman untuk mengubah jalur file Windows ke jalur file Unix dengan penggantian sederhana?

12

Jadi misalnya katakan saya memilikinya sehingga semua file saya akan ditransfer dari mesin windows ke mesin unix seperti: C:\test\myFile.txtto {somewhere}/test/myFile.txt(huruf drive tidak relevan pada saat ini).

Saat ini, perpustakaan utilitas kami yang kami tulis sendiri menyediakan metode yang melakukan penggantian sederhana dari semua garis miring dengan garis miring:

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

Garis miring dicadangkan dan tidak dapat menjadi bagian dari nama file, sehingga struktur direktori harus dipertahankan. Namun, saya tidak yakin apakah ada komplikasi lain antara windows dan path unix yang mungkin perlu saya khawatirkan (misalnya: nama non-ascii, dll)

MxLDevs
sumber
4
Hanya berhati-hati dengan spasi - menempatkan spasi di nama folder windows jauh lebih umum daripada di nama direktori unix. Secara khusus, "\ Program Files" membuat saya setiap saat. Bergantung pada bagaimana Anda menggunakan jalur, Anda mungkin harus keluar dari spasi dengan "\".
Rob
1
@delnan untuk kesederhanaan, mari kita membatasi ruang lingkup jalur untuk mengecualikan jalur variabel.
MxLDevs
2
@ MxyL Masalahnya tidak hilang ketika Anda membuat kode path yang sulit alih-alih menggunakan variabel lingkungan. Jika Anda hanya ingin jalan yang tidak meledak, Anda harus baik-baik saja. Jika Anda ingin jalur yang bermakna, atau jika Anda ingin berinteraksi dengan perangkat lunak lain (atau harapan pengguna ...), Anda memerlukan panggilan penilaian per-jalur.
1
@delnan Saya terutama berfokus pada menghasilkan jalur yang valid, tapi itu bagus. Jalan yang saya konversi seharusnya cukup sederhana sehingga mereka bermakna sendiri.
MxLDevs
3
Backslash diizinkan dalam nama file di Linux, jadi mengganti backslash di jalur Linux dapat menambah direktori yang tidak valid. Misalnya, /foo\\bartidak setara dengan /foo/bardi Linux.

Jawaban:

7

Ya, jika Anda hanya melakukan penggantian pada Windows, dan matikan saat berjalan di sistem lain.

Melakukan penggantian pada Unix-seperti sistem adalah salah karena \merupakan karakter yang valid dalam sebuah file atau direktori di Unix-seperti platform. Pada platform ini, hanya NULdan /dilarang dalam nama file dan direktori.

Juga, beberapa fungsi Windows API (kebanyakan yang tingkat bawah) tidak memungkinkan penggunaan garis miring - backslash harus digunakan dengannya.

Demi
sumber
4

Ya, tapi semua ini adalah poin yang bisa diperdebatkan. Java secara mulus mengkonversi garis miring ke belakang pada Windows. Anda cukup menggunakan garis miring ke depan untuk semua jalur yang dikodekan atau disimpan dalam konfigurasi dan itu akan bekerja untuk kedua platform.

Secara pribadi, saya selalu menggunakan garis miring bahkan pada Windows karena itu bukan karakter pelarian. Apakah jalur mentah dalam kode atau dieksternalisasi dalam file properti, saya menyandikannya dengan cara yang sama.

Cobalah! Ini akan bekerja di Windows. Jelas, ubah jalur aktual ke sesuatu yang ada dan pengguna Anda memiliki izin untuk membaca.

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

Bonus: Anda bahkan dapat mencampur garis miring di jalur yang sama!

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

sumber
1
Jika Anda membaca seluruh jawaban saya, Anda akan melihat di mana saya mengatakan bahwa selalu menggunakan pemisah file Unix akan berfungsi dengan benar di kedua tempat, tidak perlu konversi.
Pertanyaannya menyatakan bahwa file akan ditransfer, dan membiarkan bagaimana nama file disimpan. Saya menambahkan komentar pada pertanyaan yang meminta klarifikasi tentang hal itu. Berdasarkan jawaban, saya akan mengedit jawaban saya yang sesuai.
Sangat tidak mungkin bahwa program tersebut sebenarnya berisi daftar semua file yang sedang ditransfer secara manual. Ini jauh lebih mungkin bahwa beberapa mekanisme otomatis digunakan untuk menghitung file. Mengingat parameter masalah seperti yang dinyatakan dalam pertanyaan, mekanisme ini memberikan jalur gaya Windows tradisional. Dalam bentuk yang sekarang, jawaban ini memberitahu OP untuk memecahkan masalah yang berbeda bukannya tanpa memberitahu mereka bagaimana atau bahkan yang mereka harus mengubah mereka ke dalam masalah yang berbeda.
Eliah Kagan
Silakan baca komentar saya sebelumnya.
1
Windows mengenali fowrard dan backslash, dan telah seperti itu sejak awal MS-DOS. Yaitu setiap kernel Microsoft OS telah memiliki dukungan pemisah garis miring. COMMAND.COMPenerjemah awal memiliki preferensi run-time: Anda dapat mengonfigurasi slash mana yang akan digunakan penerjemah untuk mencetak dan menguraikan.
Kaz
3

Komplikasi lain pada Windows adalah bahwa ia juga mendukung notasi UNC serta huruf drive tradisional.

File pada server file jarak jauh dapat diakses sebagai \\server\sharename\path\filename.

Simon B
sumber
1
Saya pikir ini adalah satu-satunya masalah yang dikutip sejauh ini yang sebenarnya merupakan masalah untuk aplikasi ini. Jika ada jalur UNC yang terlibat, jalur tersebut tidak dapat dikonversi menjadi jalur gaya Unix.
Jules
2

Tidak. Ada jauh lebih banyak hal untuk dipikirkan daripada hanya pemisah jalur (hal "\ vs /"). Seperti yang disebutkan oleh Rob Y, ada bagaimana ruang ditangani, dan frekuensinya yang tinggi dalam penggunaan Windows. Ada berbagai karakter ilegal di dua lingkungan tersebut. Ada kesediaan Unix untuk mengizinkan hampir semua hal saat lolos dari "" "pemimpin. Ada Windows menggunakan '"' untuk menangani ruang yang disematkan. Ada Windows menggunakan UCS-16 dan Unix menggunakan ASCII atau UTF-8.

dll , dll , dll.

Tetapi , untuk banyak aplikasi yang dapat membuat kendala pada pathnames yang perlu mereka manipulasi, Anda sebenarnya dapat melakukannya persis seperti yang Anda sarankan. Dan itu akan bekerja setidaknya dalam sejumlah besar kasus, hanya saja tidak semuanya.

Ross Patterson
sumber
1
Saya tidak berpikir masalah ini valid untuk pertanyaan yang diajukan. Penanganan ruang adalah masalah antarmuka pengguna; Sistem Unix dapat menangani spasi dalam nama file sama seperti Windows. Karakter ilegal Windows adalah superset dari karakter Unix. Tidak mungkin ada garis miring terbalik di nama file Windows (selain pemisah direktori yang akan dikonversi). Menggunakan kutipan untuk ruang yang disematkan adalah masalah tingkat antarmuka pengguna, bukan masalah penanganan file. Kode konversi tampaknya di Jawa, jadi harus menangani konversi UCS16-> UTF8 secara otomatis.
Jules
-1

Setiap sistem operasi Microsoft, dimulai dengan MS-DOS, telah memahami, pada level kernel, baik garis miring ke depan dan garis miring terbalik .

Oleh karena itu, pada Windows, Anda dapat mengonversinya secara bebas; keduanya memiliki status yang sama sebagai pemisah yang dipesan. Dalam setiap jalur yang valid, Anda dapat mengganti garis miring terbalik dengan garis miring dan sebaliknya, tanpa mengubah artinya, sejauh menyangkut kernel.

Pada versi awal DOS, command.cominterpreter Microsoft menjadikannya pilihan yang dapat dikonfigurasi yang menggunakan slash untuk menampilkan dan mem-parsing path. Itu akhirnya dihapus.

Beberapa program ruang pengguna di Windows seperti, oh, shell Windows ( explorer.exe) tidak suka garis miring. Itu hanya pemrograman yang jelek di program-program itu.

Kaz
sumber
1
Meskipun ini benar, saya tidak percaya itu membantu untuk pertanyaan OP yang (AIUI) melibatkan konversi nama jalur yang ada, yang sudah termasuk backslash di dalamnya. Hal ini sangat berguna untuk menulis kode cross-platform untuk menyadari bahwa Anda hanya dapat menggunakan garis miring ke depan dan mereka bekerja di sebagian besar konteks, tetapi dalam kasus ini saya tidak berpikir itu membantu.
Jules
@ Jules OP sedang mentransfer file dari Windows. Jawaban ini menjelaskan bahwa tidak ada garis miring terbalik yang harus diganti. Mereka sama sekali tidak ada dalam sistem file Windows. Semua jalur dapat diekspresikan dengan garis miring ke depan (dan Windows bahkan memahaminya).
Kaz