这是您可能会考虑的起点。此选项使用 C 代码,您可以使用 R Cmd 进行编译并从 R 调用。
在文件“islocked.c”中粘贴以下内容:
#include <stdio.h>
#include <share.h>
void testLock(int *locked, char **filename)
{
FILE *stream;
if( (stream = _fsopen( *filename, "wt", _SH_DENYWR )) != NULL ) {
fclose( stream );
*locked = 0;
} else {
*locked = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
打开命令提示符 (windows | find | 'cmd')
更改为您保存上述文件的文件夹
从命令提示符 c:\ 键入以下内容
"Program File\R\R-3.1.2\bin\r" CMD SHLIB islocked.c
它不应抛出任何错误或警告并创建 .o 和 .dll 文件因此。
现在在 R 中:
dyn.load('c:\pathtothe_c_file\islocked.dll')
result->.C('testLock', islocked=as.integer(0), filename="d:\tools\r\test.dll")
result$islocked
[1] 1
dll 被 R 锁定,因此应该返回 1。尝试 .o 文件,它应该返回 0。Windows 7 和更高版本中有一个名为 IFileInUse 的 API,它可能会返回进程,并可能返回打开该文件的用户。如果您需要更多信息,可能会查看。
IsFileInUse API: http://msdn.microsoft.com/en-us/library/windows/desktop/ee330722%28v=vs.85%29.aspx
来自 Microsoft 的在命令行上运行的实用程序,如果您能够在服务器上安装工具,您可以从 R 进行 shell 操作,它可能会生成您需要的内容: http: //technet.microsoft.com/en-us/sysinternals/ bb896655.aspx