2014-01-18 8 views
7

Я хочу написать простую программу для воспроизведения аудиоклипов. Я хочу развернуть его на Windows, Linux и MacOSX. То, что все еще озадачивает меня, - это расположение файла конфигурации и папки со звуковыми клипами в разных операционных системах. Я Clojure noob. Я знаю, что Common Lisp имеет специальную библиотеку переносимости файловой системы CL-FAD. Как это делается в закрытии? Как написать переносимую программу Clojure с различными соглашениями с файловой системой в разных системах?Переносимость файловой системы Clojure

+0

Посмотрите http://richhickey.github.io/clojure/clojure.java.io-api.html – Chiron

+0

@Chiron: http://clojure.github.io/clojure/clojure.java .io-api.html - лучший URL. clojure.github.io - это место, где размещаются текущие документы, а версия в аккаунте Rich Hickey - от версии 1.1. – Chuck

ответ

21

Вы можете использовать clojure.java.io/file для создания путей в (нейтральной) платформе, как и с os.path.join в Python или File.join в Ruby.

(require '[clojure.java.io :as io]) 

;; On Linux 
(def home "/home/jbm") 
(io/file home "media" "music") ;=> #<File /home/jbm/media/music> 

;; On Windows 
(def home "c:\\home\\jbm") 
(io/file home "media" "music") ;=> #<File c:\home\jbm\media\music> 

clojure.java.io/file возвращает java.io.File. Если вам нужно, чтобы вернуться в строку, вы всегда можете использовать .getPath:

(-> home 
    (io/file "media" "music") 
    (.getPath)) 
;=> /home/jbm/media/music" 

ли что-то, что вы имели в виду?

В дополнение к clojure.java.io (и, конечно же, методы на java.io.File), raynes.fs - популярная файловая система.

+0

Чтобы вернуть строку, вы также можете просто использовать '(str path)' –

1

Обратите внимание, что Windows отлично поддерживает прямую косую черту как разделитель путей (что является удивительным, потому что таким образом вам не нужно постоянно сбрасывать обратную косую черту).

Единственная существенная сложность, с которой вы столкнетесь, заключается в том, что «стандартные» местоположения (домашняя папка и т. Д.) Различаются в системах Windows и UNIX. Поэтому вам нужно получить их из свойств системы (см. Метод getProperty в http://docs.oracle.com/javase/7/docs/api/java/lang/System.html).

0

Для подхода, не зависящего от платформы, вы можете найти канонический путь от пути к проекту и затем присоединиться к нему с именем файла.

(:require [clojure.java.io :as io :refer [file]])) 

(defn file-dir 
    "Returns canonical path of a given path" 
    [path] 
    (.getCanonicalPath (io/file path))) 

(-> "./resources" ;; relative 
    (file-dir) 
    (io/file "filename.txt")) ;;=> /path/to/project/resources/filename.txt 
Смежные вопросы