Как определить файловую систему для пути или файла в Ruby?

#ruby #windows #filesystems #ntfs

#ruby #Windows #файловые системы #ntfs

Вопрос:

Мне нужно создать безопасные имена файлов в Windows (с поддержкой символов иностранного языка). Некоторые среды разработки — Mac, другие — Windows. Наши автоматические тесты выполняются на компьютере с Windows, а приложение установлено на компьютерах с Windows. Файловые системы налагают свои собственные правила на то, что представляет собой законное имя файла (в частности, символы типа <, >, » и разделители путей являются незаконными в NTFS).

Я хотел бы написать несколько тестов, которые фактически проверяют саму файловую систему. Я пытаюсь не имитировать тесты, потому что тогда я на самом деле ничего не тестирую в реальной системе, а просто проверяю, что код обрабатывает фиктивные исключения. Тесты должны выполняться по крайней мере на Mac (ничего страшного, если они просто пропустят тест при наличии Mac), но я также хотел бы знать, на каком типе файловой системы выполняются тесты. NTFS отличается от Fat32. ПРИМЕЧАНИЕ: Я не прошу о реализации метода безопасного имени файла, он у меня уже есть. Я спрашиваю, есть ли в Ruby какой-либо способ определить, в какой файловой системе я нахожусь в данный момент, в целях тестирования. Многочисленные поиски и документы для File, FileUtils, Dir и даже ENV ничего не дали.

Комментарии:

1. я знаю, что File.join предоставит вам разделитель среды, но, похоже, он не проверяет входные данные: > File.join(«asdf», «fdas», «amp;^ * SDFIU», «asdf.jpg «) => «asdf/fdas/amp;^*SDFIU/asdf.jpg »

Ответ №1:

Вы можете попробовать sys-filesystem gem:

Это интерфейс для получения информации о файловой системе, такой как ‘df’ в Unix, но также работает в Windows.

 irb(main):001:0> require 'sys/filesystem'
=> true
irb(main):006:0> Sys::Filesystem.stat("D:\").base_type
=> "NTFS"
  

Комментарии:

1. Спасибо за информацию, но, похоже, у меня это не работает. Mac: ruby-1.9.2-p0 > Sys::Filesystem.stat('.').base_type => nil ruby-1.9.2-p0 > Sys::Filesystem.stat('/').base_type => nil Я получаю ошибку компилятора при «создании собственных расширений» для gem на Win7 Ultimate.

2. извините, у меня нет Mac. что касается Windows, есть ли у вас rubyinstaller.org/add-ons/devkit установлен?

3. да, я только что прошел установку ruby installer devkit, и, казалось, что он установлен правильно, но все еще ошибка компилятора при установке gem. в любом случае, это может быть спорным вопросом, поскольку мы, вероятно, не будем выполнять такого рода процесс установки для всех тестовых компьютеров Windows только для этой одной вещи. в любом случае спасибо.

4. Я продолжу и отмечу этот BA, хотя он не работал в моей среде, я думаю, что это было с моей стороны. Предполагая, что это работает для некоторых людей, это решение, о котором я просил, спасибо.