我想锁定一个文件,因为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。
答案 0 :(得分:2)
首先,您必须将Ruby文件描述符映射到C运行时文件描述符。我不熟悉Ruby源,知道如何做到这一点; 可能是身份转换。
其次,您必须将C运行时描述符映射到Win32文件句柄。为此,您需要_get_osfhandle。
第三,您需要修复对LockFileEx的调用,以便实际传递有效的OVERLAPPED结构; NULL不起作用。
答案 1 :(得分:2)
Ruby文件锁定机制是合作的,并且依赖于所有知道Ruby锁定文件约定的方。 Microsoft Office不会合作。
相反,我建议您使用文件系统来强制执行锁定。只需使用标准的Ruby文件处理机制,使用独占锁打开文件。