Seaside: CannotDeleteFileException: 无法删除旧版本的燃料文件
Seaside: CannotDeleteFileException: Could not delete the old version of fuel file
在 pharo seaside 应用程序中,单击主页按钮,所有数据将保存在燃料文件中,class 名称为 Test.fl。如果我在两个实例中一次调用同一个主页,两者都调用下面的代码来保存 Test.fl 文件和最新更新,
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl'**
并出现异常:
CannotDeleteFileException: Could not delete the old version of file ...\Pharo3.0\Test.fl
并且我已经使用 Mutex 允许在第一个实例之后执行另一个实例,
mutexBlock := Mutex new.
mutexBlock critical: [
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl' ]
但我仍然遇到同样的错误
CannotDeleteFileException: Could not delete the old version of file
请任何人帮我解决这个错误。
您的直觉很可能是正确的:两个进程正试图同时写入(删除)同一个文件。但是,您的 Mutex
方法将不起作用,因为每次执行该代码时都会创建一个新的 Mutex
。您必须将 Mutex
存储在 class 或实例变量中(取决于您的代码的工作方式),以便每个进程都将使用 相同的实例 Mutex
.
您的代码将如下所示:
MyClass class>>serializeProtect
^ SerializeProtect ifNil: [ SerializeProtect := Mutex new ]
self class serializeProtect critical: [
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl' ]
注意:惰性初始化 Mutex
通常 不 安全。为了简单起见,我只是在这里这样做。
那里不需要互斥锁。 Pharo 的 Seaside 一次处理一个请求。也就是说,这仅在您的文件写入速度很快时才有效,因为所有其他连接都在等待写入完成。如果不是,则需要在单独的线程中进行写入,然后确实控制对它的访问
在 pharo seaside 应用程序中,单击主页按钮,所有数据将保存在燃料文件中,class 名称为 Test.fl。如果我在两个实例中一次调用同一个主页,两者都调用下面的代码来保存 Test.fl 文件和最新更新,
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl'**
并出现异常:
CannotDeleteFileException: Could not delete the old version of file ...\Pharo3.0\Test.fl
并且我已经使用 Mutex 允许在第一个实例之后执行另一个实例,
mutexBlock := Mutex new.
mutexBlock critical: [
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl' ]
但我仍然遇到同样的错误
CannotDeleteFileException: Could not delete the old version of file
请任何人帮我解决这个错误。
您的直觉很可能是正确的:两个进程正试图同时写入(删除)同一个文件。但是,您的 Mutex
方法将不起作用,因为每次执行该代码时都会创建一个新的 Mutex
。您必须将 Mutex
存储在 class 或实例变量中(取决于您的代码的工作方式),以便每个进程都将使用 相同的实例 Mutex
.
您的代码将如下所示:
MyClass class>>serializeProtect
^ SerializeProtect ifNil: [ SerializeProtect := Mutex new ]
self class serializeProtect critical: [
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl' ]
注意:惰性初始化 Mutex
通常 不 安全。为了简单起见,我只是在这里这样做。
那里不需要互斥锁。 Pharo 的 Seaside 一次处理一个请求。也就是说,这仅在您的文件写入速度很快时才有效,因为所有其他连接都在等待写入完成。如果不是,则需要在单独的线程中进行写入,然后确实控制对它的访问