2011-05-10 48 views
0

我正在編寫一個記錄電池充電到CSV文件的工具(我知道這是一個bash單線程,但這是我的另一個Common Lisp學習練習)。確定ACPI狀態文件的長度

我的計劃是將整個電池狀態文件存入內存,因爲它保證是一個小文件。但file-length始終文件尺寸返回0,而在其他文件中正常工作:

* (defun stream-length (path) 
    (with-open-file (stream path) 
      (file-length stream))) 

STYLE-WARNING: redefining COMMON-LISP-USER::STREAM-LENGTH in DEFUN 

STREAM-LENGTH 
* (stream-length "/home/duncan/foo") 

4 
* (stream-length "/proc/acpi/battery/BAT0/state") 

0 

事實證明,這不僅是SBCL; Perl中的工作方式:

$ perl -e 'print -s "/home/duncan/foo"; print "\n"' 
4 
$ perl -e 'print -s "/proc/acpi/battery/BAT0/state"; print "\n"' 
0 

但文件明確包含的東西:

$ cat /proc/acpi/battery/BAT0/state 
present:     yes 
capacity state:   ok 
charging state:   discharging 
present rate:   0 mW 
remaining capacity:  3945 mWh 
present voltage:   10800 mV 

所以我假定有什麼特別的狀態文件。有人能告訴我它是什麼嗎?

回答

1

大多數/proc文件是特殊的。它們的內容不存在任何地方存儲,但當進程打開並讀取給定文件時,可按需製作。每次閱讀內容的大小可能會有所不同。所以,他們通常不會宣傳任何特定的尺寸。

正確的方法是簡單地打開文件並讀取它直到EOF。

+0

我會說閱讀,直到在大多數情況下EOF是正確的方法:兩步解決方案是一個明顯的種族。 – 2012-04-06 15:59:12