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

Smalltalk Seaside:CannotDeleteFileException:无法删除旧版本的fuel文件,smalltalk,pharo,seaside,Smalltalk,Pharo,Seaside,在pharo seaside应用程序的主页按钮中,单击所有数据将保存在一个燃料文件中,其中一些类名为Test.fl。如果我在两个实例中一次调用同一主页,两个实例都调用下面的代码来保存Test.fl文件和最新更新 FLSerializer serialize: self allObjects toFileNamed: self name , '.fl'** 以及获得异常: CannotDeleteFileException:无法删除文件的旧版本…\Pharo3.0\Test.fl

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

FLSerializer
    serialize: self allObjects
    toFileNamed: self name , '.fl'**
以及获得异常:

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

我使用互斥来允许在第一个实例之后执行另一个实例

mutexBlock := Mutex new.
mutexBlock critical: [
    FLSerializer
        serialize: self allObjects
        toFileNamed: self name , '.fl' ]
但我还是犯了同样的错误

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


请任何人帮我解决这个错误。

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

您的代码将如下所示:

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

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

注意:延迟初始化互斥锁通常是不安全的。我只是为了简单起见才在这里使用它。

那里不需要互斥。Seaside in Pharo一次处理一个请求。也就是说,这仅在文件写入速度快时有效,因为所有其他连接都在等待写入完成。如果不是,则需要在单独的线程中编写,然后控制对它的访问

它正在工作。我获取了一个类变量,并在类的initialize方法中初始化了它。谢谢你,麦克斯。很高兴我能帮上忙。