我正在编写一个工具来记录电池电量到CSV文件(我知道这是一个bash单行程序,但这是我的另一个Common Lisp学习练习)。
我的计划是将整个电池状态文件粘贴到内存中,因为它确保是一个小文件。但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
所以我假设状态文件有一些特别之处。有人可以告诉我它是什么吗?
答案 0 :(得分:1)
大多数/proc
个文件都很特殊。它们的内容不存在于任何地方,但在进程打开并读取给定文件时按需生成。并且每次读取时内容的大小可能不同。因此,他们通常不会宣传任何特定的尺寸。
正确的方法是简单地打开文件并阅读它直到EOF。