Windows dosya yollarını basit bir değiştirmeyle Unix dosya yollarına dönüştürmek güvenli midir?


12

Örneğin, tüm dosyalarımın bir windows makinesinden bir unix makinesine aktarılacağı şekilde sahip olduğumu varsayalım: C:\test\myFile.txt- {somewhere}/test/myFile.txt(sürücü harfi bu noktada önemsizdir).

Şu anda, kendimize yazdığımız yardımcı program kütüphanemiz, tüm eğik çizgilerin basit eğik çizgilerle basit bir şekilde değiştirilmesini sağlayan bir yöntem sunmaktadır:

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

Eğik çizgiler ayrılmıştır ve dosya adının bir parçası olamaz, bu nedenle dizin yapısı korunmalıdır. Ancak, endişelenmem gereken pencereler ve unix yolları arasında başka komplikasyonlar olup olmadığından emin değilim (örneğin: ascii olmayan adlar, vb.)


4
Boşluklara dikkat edin - windows klasör adlarına boşluk koymak, unix dizin adlarından çok daha yaygındır. Özellikle, "\ Program Files" beni her zaman alır. Yolları nasıl kullandığınıza bağlı olarak, "\" ile boşluklardan kaçmanız gerekebilir.
Rob

1
Kolaylık için @delnan, değişken yolları hariç tutmak için yolların kapsamını sınırlayalım.
MxLDevs

2
@MxyL Bir ortam değişkeni kullanmak yerine yolu zor kodladığınızda sorun ortadan kalkar. Sadece patlamamış bir yol istiyorsanız, iyi olmalısınız. Anlamlı bir yol istiyorsanız veya diğer yazılımlarla (veya kullanıcı beklentileriyle) etkileşim kurmak istiyorsanız, yol başına karar çağrılarına ihtiyacınız vardır.

1
@delnan Çoğunlukla geçerli bir yol üretmeye odaklandım, ama bu iyi bir nokta. Dönüştürdüğüm yollar, kendileri için anlamlı olacak kadar basit olmalıdır.
MxLDevs

3
Linux'taki dosya adlarında ters eğik çizgilere izin verildiğinden, bir Linux yolundaki ters eğik çizgilerin değiştirilmesi geçersiz dizinler ekleyebilir. Örneğin, Linux'takine /foo\\bareşdeğer değildir /foo/bar.

Yanıtlar:


7

Evet, eğer yalnızca değiştirme yapmak Windows üzerinde, ve diğer sistemlerde çalışırken kapatın.

Üzerinde değiştirme yapmak Unix benzeri sistemler ise yanlış çünkü \bir olan platformlar Unix benzeri bir dosya veya dizin adı geçerli bir karakter. Bu platformlarda, sadece NULve /dosya ve dizin isimlerinde yasaktır.

Ayrıca, bazı Windows API fonksiyonları (çoğunlukla alt seviye olanlar) izin vermez ileriye eğik çizgiler kullanımını - tersbölüler gerekir onlarla kullanılabilir.


4

Evet, ama bütün bunlar tartışmalı bir nokta. Java, eğik çizgileri sorunsuz bir şekilde Windows'ta eğik çizgilere dönüştürür. Sabit kodlanmış veya konfigürasyonda saklanan tüm yollar için eğik çizgi kullanabilirsiniz. Her iki platform için de çalışır.

Şahsen, her zaman Windows'ta bile eğik çizgi kullanıyorum çünkü bu kaçış karakteri değil . Ham yolun kodda olması veya bir özellikler dosyasında dışsallaştırılması olsun, aynı şekilde kodlarım.

Dene! Bu Windows'da çalışacaktır. Açıkçası, gerçek yolu var olan bir şeye değiştirin ve kullanıcınızın okuma izni vardır.

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

Bonus: Eğik çizgileri aynı yolda bile karıştırabilirsiniz !

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

1
Tüm yanıtımı okursanız , Unix dosya ayırıcısının her zaman her iki yerde de doğru çalışacağını, dönüşüm gerektirmediğini söylediğim yeri görürsünüz .

Soru, dosyaların aktarılacağını belirtir ve dosya adlarının nasıl saklandığını açık bırakır . Soruya o konuda açıklama isteyen bir yorum ekledim. Cevaba dayanarak cevabımı uygun şekilde düzenleyeceğim.

Programın aslında içinde aktarılan tüm dosyaların manuel olarak girilmiş bir listesini içermesi pek olası değildir. Dosyaları numaralandırmak için bazı otomatik mekanizmaların kullanılması büyük olasılıkla daha olasıdır. Sorunun parametreleri soruda belirtildiği gibi verildiğinde, bu mekanizma geleneksel Windows tarzı yollar sunar. Mevcut haliyle, bu cevap bile onları nasıl ya söylemeden yerine farklı bir sorunu çözmek için OP anlatıyor o farklı problem haline onların dönüşümü gerekmektedir.
Eliah Kagan

Lütfen önceki yorumumu okuyun.

1
Windows hem kümes hayvanlarını hem de ters eğik çizgileri tanır ve MS-DOS'un başından beri bu şekilde olmuştur. Yani her Microsoft OS çekirdeğinde eğik çizgi ayırıcı desteği vardır. İlk COMMAND.COMtercümanların çalışma zamanı tercihi vardı: tercümanın yazdırma ve ayrıştırma için hangi eğik çizgiyi kullanacağını yapılandırabilirsiniz.
Kaz

3

Windows üzerindeki bir diğer sorun da geleneksel sürücü harflerinin yanı sıra UNC gösterimini de desteklemesidir.

Uzak dosya sunucusundaki bir dosya olarak erişilebilir \\server\sharename\path\filename.


1
Bu şimdiye kadar alıntı tek endişe bu aslında bu uygulama için bir sorun olduğunu düşünüyorum. UNC yolları dahil varsa, bunlar olamaz Unix tarzı yoluna yararlı dönüştürülebilir.
Jules

2

Hayır. Düşünülmesi gereken sadece yol ayırıcıdan ("\ vs /" şey) çok daha fazla şey var. Rob Y'den bahsedildiği gibi, alanların nasıl ele alındığı ve Windows kullanımındaki yüksek frekansları vardır. İki ortamda farklı yasadışı karakterler var. Unix'in önde gelen "\" karakterinden kaçtığında hemen hemen her şeye izin verme isteği vardır. Yerleşik alanlarla başa çıkmak için Windows "" ", UCS-16 ve Unix'in ASCII veya UTF-8'i kullanması için Windows kullanımı vardır.

vs , vs , vs

Ancak , manipüle etmeleri gereken yol adlarına kısıtlamalar koyabilecek birçok uygulama için, aslında önerdiğiniz gibi yapabilirsiniz. Ve en azından çok sayıda durumda çalışacak, hepsi değil.


1
Bu endişelerin poz olarak soru için geçerli olduğunu sanmıyorum Alan işleme bir kullanıcı arayüzü sorunu; Unix sistemleri , Windows gibi, dosya adlarındaki boşlukları da işleyebilir. Windows yasa dışı karakterleri Unix karakterlerinin bir üst kümesidir. Windows dosya adlarında (dönüştürülecek dizin ayırıcıları dışında) ters eğik çizgi olamaz. Gömülü alanlar için tırnak işareti kullanmak, dosya işleme sorunu değil, kullanıcı arayüzü düzeyinde bir sorundur. Dönüşüm kodu görünüşte Java'da, bu nedenle UCS16-> UTF8 dönüşümünü otomatik olarak işlemelidir.
Jules

-1

MS-DOS ile başlayan her Microsoft işletim sistemi, çekirdek düzeyinde hem eğik çizgi hem de ters eğik çizgi anlamıştır .

Bu nedenle, Windows'ta, aralarında özgürce dönüştürebilirsiniz; her ikisi de ayrılmış ayırıcılar olarak eşit statüye sahiptir. Geçerli herhangi bir yolda, ters eğik çizgileri, çekirdek söz konusu olduğunda anlamını değiştirmeden eğik çizgilerle veya tersi olarak değiştirebilirsiniz.

DOS'un ilk sürümlerinde, Microsoft'un command.comyorumlayıcısı, yolları görüntülemek ve ayrıştırmak için eğik çizgi kullanılan yapılandırılabilir bir tercih yaptı. Sonunda kaldırıldı.

Windows'taki bazı kullanıcı-uzay programları, oh, Windows kabuğu ( explorer.exe) eğik çizgileri sevmez. Bu sadece bu programlarda kalitesiz programlama.


1
Bu doğru olsa da, OP'nin (AIUI) mevcut yol adlarını dönüştürmeyi içeren sorusuna yardımcı olduğunu düşünmüyorum, bu da bunlara ters eğik çizgiler ekleyecektir. O ise sadece eğik kullanabilirsiniz ve onları en bağlamlarda çalışmak olabilir fark çapraz platform kod yazmak için çok yararlı, ancak bu durumda ben yardımcı sanmıyorum.
Jules

@Jules OP, Windows'dan dosya aktarıyor. Bu cevap değiştirilecek ters eğik çizgi olmadığını açıklar. Windows dosya sisteminin içinde değiller. Tüm yollar eğik çizgi ile ifade edilebilir (ve Windows bile bunu anlar).
Kaz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.