0

我想像 MS Office 应用程序从 Ruby 程序中那样锁定文件,这样就不允许删除,因为“文件是在另一个程序上打开的”。

Ruby 标准库似乎无法做到这一点——我刚刚尝试过flock()——所以我试图调用LockFileEx函数。

fd = File.open("locked.file", File::RDWR|File::CREAT, 0644)
fd.write "this file to be locked"
import_array = %w(p i i i i i)
wapi = Win32API.new('kernel32', 'LockFileEx', import_array, "i")
wapi.call(fd, 1, 0, 0, 0, 0)

wapi.call 失败并出现 TypeError 异常“无法将文件转换为字符串”。

我应该使用什么作为 import_array 中的第一项来表示文件句柄?

如何将文件描述符打包成 String ?我从哪里获得文件描述符结构?

我正在使用 Ruby 1.9.3。

4

2 回答 2

2

首先,您必须将 Ruby 文件描述符映射到 C 运行时文件描述符。我对 Ruby 源代码不够熟悉,不知道该怎么做;它可能是一个身份转换。

其次,您必须将 C 运行时描述符映射到 Win32 文件句柄。为此,您需要_get_osfhandle

第三,您需要修复您对 LockFileEx 的调用,以便您真正传递一个有效的 OVERLAPPED 结构;NULL 将不起作用。

于 2013-09-17T15:58:45.973 回答
2

Ruby 文件锁定机制是协作的,并且依赖于所有各方都知道 Ruby 锁定文件的约定。Microsoft Office 不会合作。

相反,我建议您让文件系统强制执行锁定。只需使用标准 Ruby 文件处理机制以独占锁打开文件。

于 2013-09-19T08:05:49.680 回答