gpt4 book ai didi

common-lisp - 打开一个文件,如果文件不存在则做其他事情

转载 作者:行者123 更新时间:2023-12-04 03:16:30 25 4
gpt4 key购买 nike

我想打开一个文件并读取内容,或者如果文件不存在则执行其他操作。

前者可以很容易地完成:with-open-file

对于后者,我首先想到的是使用handler-case来捕获错误,但是SBCL说是SB-INT:SIMPLE-FILE-ERROR,这听起来像一个编译器内部符号,因此可能是不可移植的。

执行此操作的可移植方法是什么?

最佳答案

使用 :if-does-not-exist nil(参见 OPEN ):

(defun test (path)
(with-open-file (stream path
:if-does-not-exist nil
:element-type '(unsigned-byte 8))
(if stream
(read-byte stream)
:something-else)))

使用不存在的路径名:

(test #P"/hopefully/path/does/not/exist")
=> :SOMETHING-ELSE

使用现有路径名:

(test #P"/dev/urandom")
=> 123

您还可以使用 PROBE-FILE就像 Rainer 解释的那样检查文件是否存在,但是在 probe-file 成功返回之后但在实际打开它之前,您可能会冒着文件被另一个进程删除的风险。

For the latter, my first thought was to use handler-case to catch the error, but SBCL says it's SB-INT:SIMPLE-FILE-ERROR, which sounds like a compiler internal symbol, therefore presumably nonportable.

当您捕获到特定于实现的错误时,您可以尝试检查其类层次结构以找到名称属于 Common-Lisp 包的最接近的父类(super class):

CL-USER> (inspect (find-class 'SB-INT:SIMPLE-FILE-ERROR)) 

The object is a STANDARD-OBJECT of type SB-PCL::CONDITION-CLASS.
0. %TYPE: (CLASS #<SB-PCL::CONDITION-CLASS SB-INT:SIMPLE-FILE-ERROR>)
...
5. DIRECT-SUPERCLASSES: (#<SB-PCL::CONDITION-CLASS COMMON-LISP:SIMPLE-CONDITION>
#<SB-PCL::CONDITION-CLASS COMMON-LISP:FILE-ERROR>)
6. DIRECT-SUBCLASSES: NIL
...
11. %CLASS-PRECEDENCE-LIST: (#<SB-PCL::CONDITION-CLASS SB-INT:SIMPLE-FILE-ERROR>
#<SB-PCL::CONDITION-CLASS COMMON-LISP:SIMPLE-CONDITION>
#<SB-PCL::CONDITION-CLASS COMMON-LISP:FILE-ERROR>
#<SB-PCL::CONDITION-CLASS COMMON-LISP:ERROR>
#<SB-PCL::CONDITION-CLASS COMMON-LISP:SERIOUS-CONDITION>
#<SB-PCL::CONDITION-CLASS COMMON-LISP:CONDITION>
#<SB-PCL::SLOT-CLASS SB-PCL::SLOT-OBJECT>
#<SB-PCL:SYSTEM-CLASS COMMON-LISP:T>)
...

上面说的是,在 SBCL 中,SB-INT:SIMPLE-FILE-ERROR 有两个直接父类(super class),其中之一是 COMMON-LISP:FILE-ERROR.

这是另一个使用 CCL 的示例:

? (handler-case (open #P"/tmp/foo/bar/baz/foo") (error (e) (inspect e)))

[0] #<CCL::SIMPLE-FILE-ERROR #x3020004DE7ED>
[1] Class: #<STANDARD-CLASS CCL::SIMPLE-FILE-ERROR>
[2] Wrapper: #<CCL::CLASS-WRAPPER CCL::SIMPLE-FILE-ERROR #x3020000F62DD>
Instance slots
[3] PATHNAME: #P"/tmp/foo/bar/baz/foo"
[4] CCL::ERROR-TYPE: "No such file or directory : ~s"
[5] CCL::FORMAT-CONTROL: #<Unbound>
[6] CCL::FORMAT-ARGUMENTS: (NIL)
Inspect> 1
[0] #<STANDARD-CLASS CCL::SIMPLE-FILE-ERROR>
[1] Class: #<STANDARD-CLASS STANDARD-CLASS>
...
[6] CCL::PRECEDENCE-LIST: (#<STANDARD-CLASS CCL::SIMPLE-FILE-ERROR>
#<STANDARD-CLASS SIMPLE-CONDITION>
#<STANDARD-CLASS FILE-ERROR> #<STANDARD-CLASS ERROR>
#<STANDARD-CLASS SERIOUS-CONDITION> ...)
...
[8] CCL::DIRECT-SUPERCLASSES: (#<STANDARD-CLASS SIMPLE-CONDITION>
#<STANDARD-CLASS FILE-ERROR>)
...

关于common-lisp - 打开一个文件,如果文件不存在则做其他事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52828441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com