Чи безпечно конвертувати шляхи до файлів Windows до шляхів файлів Unix простою заміною?


12

Так, наприклад, скажіть, що у мене було так, що всі мої файли будуть перенесені з машини Windows на Unix-машину як таку: C:\test\myFile.txtдо {somewhere}/test/myFile.txt(буква диска в цьому пункті не має значення).

В даний час наша бібліотека утиліт, яку ми написали самі, пропонує метод, який дозволяє просто замінити всі косої косої риски косою рискою вперед:

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

Штрихи зарезервовані і не можуть бути частиною імені файлу, тому структура каталогів повинна бути збережена. Однак я не впевнений, чи є інші ускладнення між вікнами та unix-шляхами, про які мені може знадобитися турбуватися (наприклад: імена, що не відносяться до ascii тощо)


4
Просто слідкуйте за пробілами - розміщення пробілів у назвах папок Windows набагато частіше, ніж у іменах каталогу Unix. Зокрема, "\ Program Files" отримує мене весь час. Залежно від того, як ви використовуєте шляхи, вам, можливо, доведеться уникати пробілів з символом "\".
Роб

1
@delnan для простоти, обмежимо область шляхів, щоб виключити змінні шляхи.
MxLDevs

2
@MxyL Проблема не зникає, коли ви жорстко кодуєте шлях замість використання змінної середовища. Якщо ви просто хочете шлях, який не підірветься, вам слід добре. Якщо ви хочете осмислений шлях, або якщо ви хочете взаємодіяти з іншим програмним забезпеченням (або очікуваннями користувачів ...), вам потрібні дзвінки за оцінку за кожний шлях.

1
@delnan Я в основному зосереджений на створенні дійсного шляху, але це хороший момент. Шляхи, які я перетворюю, повинні бути досить простими, щоб вони були осмислені самі по собі.
MxLDevs

3
Зворотні риски дозволені у назви файлів для Linux, тому заміна зворотних косих ринків у Linux може додати недійсні каталоги. Наприклад, /foo\\barне еквівалентно /foo/barLinux.

Відповіді:


7

Так, якщо ви замінюєте лише в Windows, і вимикаєте її під час роботи в інших системах.

Робити заміну в системах, схожих на Unix, неправильно, оскільки \це дійсний символ у імені файлу чи каталогу на платформах, схожих на Unix. На цих платформах, тільки NULі /заборонені в іменах файлів і каталогів.

Крім того , деякі функції API Windows ( в основному ті , нижчий рівень) не дозволяють використовувати слеша - зворотні косі повинні використовуватися з ними.


4

Так, але вся ця справа є суперечливою. Java безперешкодно перетворює косою косою рисою назад у косу рису в Windows. Ви можете просто використовувати косої риски для всіх контурів, які жорстко закодовані або зберігаються в конфігурації, і вони працюватимуть для обох платформ.

Особисто я завжди використовую косу косу рису навіть у Windows, тому що це не символ втечі. Незалежно від того, чи є необроблений шлях у коді чи зовнішній у файлі властивостей, я кодую його таким же чином.

Спробуй це! Це буде працювати в Windows. Очевидно, змініть фактичний шлях на те, що існує, і ваш користувач має дозвіл на читання.

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

Бонус: ви можете навіть змішувати косі риски на тому ж шляху!

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

1
Якщо ви прочитаєте всю мою відповідь, ви побачили б, де я кажу, що завжди використання роздільника файлів Unix буде працювати правильно в обох місцях, конверсія не потрібна.

У запитанні зазначено, що файли будуть передані, і залишається відкритим, як зберігаються імена файлів . Я додав коментар до питання, просивши роз'яснити з цього приводу. Виходячи з відповіді, я відредагую свою відповідь відповідно.

Навряд чи програма насправді містить всередині нього список, що передається вручну. Набагато ймовірніше, що для перерахування файлів використовується якийсь автоматизований механізм. Враховуючи параметри проблеми, як вони вказані у запитанні, цей механізм забезпечує традиційні шляхи в стилі Windows. У своїй нинішній формі ця відповідь наказує ОП вирішити іншу проблему замість цього, не повідомляючи їм, як і навіть, що вони повинні перетворити свою проблему на іншу проблему.
Елія Каган

Будь ласка, прочитайте мій попередній коментар.

1
Windows розпізнає як перекос, так і зворотний кут нахилу, і так було з ранніх MS-DOS. Тобто кожне ядро ​​ОС Microsoft має підтримку роздільника передніх косооких рядків. Ранні COMMAND.COMперекладачі мали перевагу під час виконання: ви могли налаштувати, яку косу рису інтерпретатор буде використовувати для друку та розбору.
Каз

3

Ще одне ускладнення в Windows полягає в тому, що він також підтримує позначення UNC, а також традиційні літери накопичувача.

До файлу на віддаленому файловому сервері можна отримати доступ як \\server\sharename\path\filename.


1
Я думаю, що це єдина проблема, котирувана на даний момент, що насправді є проблемою для цієї програми. Якщо задіяні шляхи UNC, вони не можуть бути корисно перетворені в шлях у стилі Unix.
Жуль

2

Ні. Є набагато більше речей, про які варто думати, ніж просто роздільник шляху (річ "\ vs /"). Як згадує Роб Y, існує спосіб обробки просторів та їх висока частота у використанні Windows. У двох середовищах є різні незаконні персонажі. Є бажання Unix дозволити майже все, коли втече провідний "\". Існує використання Windows "" "для роботи з вбудованими просторами. Існує використання Windows у UCS-16 та Unix, як ASCII або UTF-8.

і т.д. , і т.д. , і т.д.

Але для багатьох застосунків, які можуть ставити обмеження для імен шляхів, якими вони повинні маніпулювати, ви насправді можете робити це саме так, як ви запропонуєте. І це спрацює принаймні у великій кількості справ, просто не у всіх.


1
Я не думаю, що ці занепокоєння справедливі для поставленого питання. Обробка простору - це проблема з інтерфейсом користувача; Системи Unix можуть обробляти пробіли у файлах файлів так само добре, як і Windows. Незаконні символи Windows - це набір символів Unix. У назви файлів Windows не може бути зворотних нахилів (крім роздільників каталогів, які будуть перетворені). Використання лапок для вбудованих просторів є проблемою рівня користувальницького інтерфейсу, а не проблемою з обробкою файлів. Код перетворення, очевидно, у Java, тому повинен обробляти перетворення UCS16-> UTF8 автоматично.
Жуль

-1

Кожна операційна система Майкрософт, починаючи з MS-DOS, на рівні ядра розуміла як косі нахили, так і косої .

Тому в Windows ви можете вільно конвертувати між ними; обидва мають рівний статус як зарезервовані роздільники. У будь-якому дійсному шляху ви можете замінити косою рисою косою рисою і навпаки, не змінюючи її значення, що стосується ядра.

У ранніх версіях DOS command.comінтерпретатор Майкрософт зробив налаштовувану перевагу, котра коса риса використовується для відображення та розбору шляхів. Це врешті було знято.

Деякі програми в просторі користувачів у Windows, такі як, о, оболонка Windows ( explorer.exe), не люблять косої риски вперед. Це просто нерозумне програмування в цих програмах.


1
Хоча це правда, я не вважаю, що це корисно для питання ОП, який (AIUI) передбачав перетворення існуючих імен шляхів, які б вже включали в них зворотні риски. Це є дуже корисним для написання кросу-платформного коду , щоб зрозуміти , що ви можете просто використовувати слеш і вони працюють в більшості контекстів, але в даному випадку я не думаю , що це допомагає.
Жуль

@Jules OP передає файли з Windows. Ця відповідь пояснює, що немає зворотних нахилів, які слід замінити. Їх взагалі немає у самій файловій системі Windows. Усі шляхи виразні з косою рисою вперед (а Windows навіть це розуміє).
Каз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.