2010-08-30 75 views
3

我試圖使用clojure.contrib.io的(1.2)append-spit添加到文件(去圖)。添加spit的問題

如果我創造我的桌面上的文本文件,作爲測試,並試圖將追加到它在一個新的REPL,這是我得到:

user> (append-spit "/Users/ihodes/Desktop/test.txt" "frank") 
Backtrace: 
    0: clojure.contrib.io$assert_not_appending.invoke(io.clj:115) 
    1: clojure.contrib.io$outputstream__GT_writer.invoke(io.clj:266) 
    2: clojure.contrib.io$eval1604$fn__1616$G__1593__1621.invoke(io.clj:121) 
    3: clojure.contrib.io$fn__1660.invoke(io.clj:185) 
    4: clojure.contrib.io$eval1604$fn__1616$G__1593__1621.invoke(io.clj:121) 
    5: clojure.contrib.io$append_writer.invoke(io.clj:294) 
    6: clojure.contrib.io$append_spit.invoke(io.clj:342) 
    7: user$eval1974.invoke(NO_SOURCE_FILE:1) 
    8: clojure.lang.Compiler.eval(Compiler.java:5424) 
    9: clojure.lang.Compiler.eval(Compiler.java:5391) 
10: clojure.core$eval.invoke(core.clj:2382) 
11: swank.commands.basic$eval_region.invoke(basic.clj:47) 
12: swank.commands.basic$eval_region.invoke(basic.clj:37) 
13: swank.commands.basic$eval807$listener_eval__808.invoke(basic.clj:71) 
14: clojure.lang.Var.invoke(Var.java:365) 
15: user$eval1972.invoke(NO_SOURCE_FILE) 
16: clojure.lang.Compiler.eval(Compiler.java:5424) 
17: clojure.lang.Compiler.eval(Compiler.java:5391) 
18: clojure.core$eval.invoke(core.clj:2382) 
19: swank.core$eval_in_emacs_package.invoke(core.clj:94) 
20: swank.core$eval_for_emacs.invoke(core.clj:241) 
21: clojure.lang.Var.invoke(Var.java:373) 
22: clojure.lang.AFn.applyToHelper(AFn.java:169) 
23: clojure.lang.Var.applyTo(Var.java:482) 
24: clojure.core$apply.invoke(core.clj:540) 
25: swank.core$eval_from_control.invoke(core.clj:101) 
26: swank.core$eval_loop.invoke(core.clj:106) 
27: swank.core$spawn_repl_thread$fn__489$fn__490.invoke(core.clj:311) 
28: clojure.lang.AFn.applyToHelper(AFn.java:159) 
29: clojure.lang.AFn.applyTo(AFn.java:151) 
30: clojure.core$apply.invoke(core.clj:540) 
31: swank.core$spawn_repl_thread$fn__489.doInvoke(core.clj:308) 
32: clojure.lang.RestFn.invoke(RestFn.java:398) 
33: clojure.lang.AFn.run(AFn.java:24) 
34: java.lang.Thread.run(Thread.java:637) 

這顯然不是我想要的東西。

我想知道是否有其他人有這些問題,或者如果我做錯了什麼?我追加到的文件不是打開(至少由我)。我很茫然。

非常感謝!

回答

7

我注意到相關函數在1.2中被標記爲棄用,但我也有這樣的印象,就像寫下來的那樣,他們有一些需要熨平的錯誤。

首先,非不推薦的方法做你試圖做(這對我來說工作正常):

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

(with-open [w (io/writer (io/file "/path/to/file") 
         :append true)] 
    (spit w "Foo foo foo.\n")) 

(跳過io/file,簡單地傳遞字符串io/writer將工作太 - 我更喜歡使用包裝器作爲個人品味的一部分,並且部分地使得c.j.io不嘗試將該串視爲URL(僅通過例外退出並在這種情況下去找文件),這是它的第一個)

至於爲什麼我認爲clojure.contrib.io可能會遭受從一個bug荷蘭國際集團:

(require '[clojure.contrib.io :as cio]) 

(with-bindings {#'cio/assert-not-appending (constantly true)} 
    (cio/append-spit "/home/windfall/scratch/SO/clj/append-test.txt" "Quux quux quux?\n")) 

這不抱怨,但它也不追加到該文件 - 當前內容被改爲取代。我不確定究竟是什麼問題,但切換到clojure.java.io應該避免它。 (顯然這需要進一步調查 - 不推薦使用的代碼仍然不應該是越野車 - 我會盡力弄清楚。)

+0

我不知道關於:append選項。酷我可以在sexpbot的日誌插件中使用它。無論如何,都需要徹底檢修。 – Rayne 2010-08-30 06:13:55

+2

是的,這是clojure-contrib 1.2中的一個已知錯誤:http://www.assembla.com/spaces/clojure-contrib/tickets/90。已經提出了一個解決方案。不過最好的解決方法是使用clojure.java.io,因爲clojure.contrib.io已經被棄用,並且會隨着1.3的消失而消失。 – bendin 2010-08-30 11:00:21

+0

@bendin:啊,很高興知道,謝謝。良好的工作分類和修復! @Rayne:很酷。 :-) – 2010-08-30 12:27:29