如何用R安全检测docx文件是否处于打开状态?
安全检测文件是否处于打开状态的R语言方法
我需要用R语言安全检测某个文件(比如test.docx)是否处于打开状态。之前使用的一种方法会损坏文件:运行后test.docx变成空白文件(大小缩减至0),即便它正确返回了FALSE(表示文件未打开)。
问题重现步骤
- 生成测试docx文件:
创建test.Rmd文件,内容如下:
--- title: "test" output: officedown::rdocx_document: --- # heading 1 # heading 2
- 渲染生成docx文件:
library(bookdown) library(officedown) library(officer) rmarkdown::render('test.Rmd', output_format = 'rdocx_document')
- 使用有问题的检测代码:
file.opened <- function(path) { suppressWarnings( "try-error" %in% class( try(file(path, open = "w"), silent = TRUE ) ) ) } file.opened("test.docx") # [1] FALSE
运行该代码后,目标文件会被清空变为空白,原因是open = "w"模式会直接截断文件内容——即使文件未被其他程序打开,写入模式也会破坏原有数据。
安全检测方案
核心原则是只读取/锁定文件,不修改内容,以下提供几种安全的实现方式:
方案1:跨平台通用(使用filelock包)
filelock包通过文件锁机制检测占用情况,不会修改文件内容:
install.packages("filelock") library(filelock) file_opened_safe <- function(path) { # 尝试获取排他锁,超时设为0立即返回结果 lock <- lock(path, exclusive = TRUE, timeout = 0) if (is.null(lock)) { # 无法获取锁,说明文件被打开或占用 return(TRUE) } else { # 成功获取锁,文件未被占用,释放锁后返回结果 unlock(lock) return(FALSE) } } # 测试调用 file_opened_safe("test.docx")
方案2:Windows平台专用(PowerShell命令)
利用Windows内置PowerShell检测文件是否被进程占用:
file_opened_windows <- function(path) { path <- normalizePath(path) # 调用PowerShell查询占用该文件的进程数 cmd <- paste0('powershell -Command "(Get-Process | Where-Object {$_.Modules.FileName -eq \'', path, '\'}).Count -gt 0"') result <- system(cmd, intern = TRUE) as.logical(result) } # 测试调用 file_opened_windows("test.docx")
方案3:Linux/macOS平台专用(lsof命令)
通过系统lsof命令检测文件是否被打开:
file_opened_unix <- function(path) { path <- normalizePath(path) cmd <- paste0('lsof ', shQuote(path)) # 执行命令并忽略错误输出,结果非空则表示文件被占用 result <- system(cmd, intern = TRUE, ignore.stderr = TRUE) length(result) > 0 } # 测试调用 file_opened_unix("test.docx")
内容的提问来源于stack exchange,提问作者user63230
相关产品推荐
相关产品推荐

