有多种基本函数可用于获取有关文件的信息。现在我正在使用免费软件SearchMyFiles来执行此操作。不过,我更愿意在 r 中进行。
我想在硬盘驱动器中搜索特定类型的文件夹,然后我想将这些文件夹中找到的文件的路径和信息返回到数据框,更具体地说,因为这些文件具有不同的所有者,我想返回文件的所有者。
我尝试过的功能是file.info()和list.files()
但是,file.info(path, extra_cols = TRUE)不返回文件的所有者。相反,它返回这个:
size isdir mode mtime ctime atime exe
10689 FALSE 666 2017-03-01 12:00:47 2017-03-01 12:00:47 2017-03-01 12:00:47 no
Run Code Online (Sandbox Code Playgroud)
1)有没有办法通过以下方式找到失主file.info()
2)是否有一种简洁的方法来搜索具有特定名称的所有文件夹并返回有关在这些文件夹中找到的文件的信息?
就像是
list.files(path_to_harddrive, folder_string) %>%
file.info()
Run Code Online (Sandbox Code Playgroud)
这个问题解决了这个问题,但没有任何公认的答案。
> as.data.frame(Sys.info())
Sys.info()
sysname Windows
release 7 x64
version build 7601, Service Pack 1
machine x86
Run Code Online (Sandbox Code Playgroud)
提供的答案不是独立于平台的,并且不适用于我的 Windows 网络驱动器。
我想出了这段代码,fs如果不在 Windows 上,它会使用该包(由 RStudio 团队提供),否则是一个极其丑陋的脚本。dirWindows 可以使用带有该标志的批处理命令来检索所有者/Q。
这完成了工作:
get_owner <- function(path) {
if (Sys.info()["sysname"] == "Windows") {
dir <- shell(paste0('dir /Q "', path, '"'), intern = TRUE)
if (tools::file_ext(basename(path)) == "") {
# it's a folder
return(gsub(".*<DIR>[ \t]+([^ ]*).*", "\\1", dir[grepl("<DIR>", dir)][1]))
} else {
# it's a file
return(trimws(gsub(basename(path), "",
gsub("^[0-9: \t.-]+", "",
dir[grepl(basename(path), dir)]),
fixed = TRUE)))
}
} else {
return(fs::file_info(path)$user)
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用:
get_owner("/Folder/Folder")
get_owner("/Folder/File")
get_owner("C:/Folder/Folder")
get_owner("C:/Folder/File")
Run Code Online (Sandbox Code Playgroud)