Я хочу заблокировать файл, как приложения MS Office, из программы Ruby, так что удаления не будут разрешены, потому что «файл открывается в другой программе».Как вызвать функцию Win32API из 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 для представления дескриптора файла?
Как упаковать дескриптор файла в строку? Где я могу получить структуру дескриптора файла?
Я использую Ruby 1.9.3.
Гораздо проще открыть файл для записи, с эксклюзивным режимом совместного доступа, а затем не писать на него. Вы можете сделать это со стандартной обработкой файлов Ruby. Абсолютно не нужно совать с Win32API низкоуровневым материалом. Просто используйте стандартный код Ruby для открытия файла (не знаю, что это такое, не знаете Ruby). В конечном итоге это будет отображаться до вызова функции API Win32 CreateFile. Вы не можете ожидать, что 'flock' будет работать, поскольку это кооперативный механизм. И не ожидайте, что Office поймет файлы блокировки Ruby. –
@ DavidHeffenan Цель состоит в том, чтобы имитировать поведение MS Office, в системе, где она недоступна (и ни MS Journal), чтобы написать тест. Открытие файла в режиме эксклюзивного совместного использования 'File :: EXCL' делает трюк. Пожалуйста, напишите ответ. Благодарю. – philant
@DavidHeffernan пропустил «r» на ваше имя, извините. – philant