Seaside:CannotDeleteFileException:无法删除旧版本的燃料文件

时间:2016-05-16 18:29:14

标签: smalltalk pharo seaside

在主页上的pharo海滨应用程序按钮上单击所有数据将保存在一个类名为Test.fl的燃料文件中。如果我在两个实例中一次调用同一个主页,则两个都调用以下代码来保存带有最新更新的Test.fl文件,

FLSerializer
    serialize: self allObjects
    toFileNamed: self name , '.fl'**

并获得例外:

  

CannotDeleteFileException:无法删除旧版本的文件...... \ Pharo3.0 \ Test.fl

我已经使用Mutex允许在第一个实例之后执行另一个实例,

mutexBlock := Mutex new.
mutexBlock critical: [
    FLSerializer
        serialize: self allObjects
        toFileNamed: self name , '.fl' ]

但我仍然得到同样的错误

  

CannotDeleteFileException:无法删除旧版本的文件

请有人帮我解决这个错误。

2 个答案:

答案 0 :(得分:5)

你的直觉可能是正确的:两个进程正在尝试同时写入(删除)同一个文件。但是,Mutex方法不起作用,因为每次执行该代码时都会创建一个新的Mutex。您必须将Mutex存储在类或实例变量中(取决于代码的工作方式),以便每个进程都使用Mutex相同的实例

您的代码看起来像这样:

MyClass class>>serializeProtect
    ^ SerializeProtect ifNil: [ SerializeProtect := Mutex new ]

self class serializeProtect critical: [
    FLSerializer
        serialize: self allObjects
        toFileNamed: self name , '.fl' ]

注意:懒惰地初始化Mutex通常安全。我只是为了简单起见而在这里做。

答案 1 :(得分:0)

你不需要互斥锁。 Pharo过程中的海边一次请求一个。也就是说,这仅在您的文件写入速度很快时才有效,因为所有其他连接都等待写入完成。如果不是,您需要在单独的线程中进行写入,然后确实控制对它的访问