从Google Drive下载前检查文件修改日期的技术问题
解决Google Drive云端与本地CSV文件修改日期对比并仅下载更新文件的问题
问题核心
你尝试用file.mtime(as_id(csv_files [1, ]))获取Google Drive云端文件的修改日期时出错,本质原因是file.mtime()是R基础函数,仅能读取本地文件系统的文件时间,无法直接访问云端文件的元数据。以下是完整的解决方案,实现仅下载云端已更新的CSV文件的需求。
完整实现步骤
1. 获取云端CSV文件及修改时间
使用googledrive包的drive_reveal()函数显式获取文件的修改时间元数据(drive_ls()返回的结果默认已包含该字段,但显式调用可确保字段存在):
library(googledrive) # 定义云端文件夹ID/URL folder_url <- "https://drive.google.com/drive/u/0/folders/1-wXe9h97H2_cKTcdHtFBGXMdTdjsgskdjhgtAq" folder <- drive_get(as_id(folder_url)) # 获取文件夹内所有CSV文件 csv_files <- drive_ls(folder, type = "csv") # 显式获取并添加文件修改时间字段 csv_files <- drive_reveal(csv_files, "modifiedTime")
此时csv_files$modifiedTime即为每个云端CSV文件的最后修改时间(UTC时区)。
2. 对比云端与本地文件时间并下载更新
假设本地CSV文件存储在./local_csvs目录下,遍历每个云端文件,对比时间后决定是否下载:
# 定义本地存储目录 local_dir <- "./local_csvs" if (!dir.exists(local_dir)) dir.create(local_dir) # 遍历所有云端CSV文件 for (i in seq(nrow(csv_files))) { # 获取当前云端文件信息 cloud_file <- csv_files[i, ] cloud_file_name <- cloud_file$name cloud_mtime <- as.POSIXct(cloud_file$modifiedTime, tz = "UTC") # 转换为本地时区,避免时区差异导致对比错误 cloud_mtime_local <- format(cloud_mtime, tz = Sys.timezone()) cloud_mtime_local <- as.POSIXct(cloud_mtime_local) # 构建本地文件路径 local_file_path <- file.path(local_dir, cloud_file_name) if (file.exists(local_file_path)) { # 获取本地文件修改时间 local_mtime <- file.mtime(local_file_path) # 对比时间:云端更新则覆盖下载 if (cloud_mtime_local > local_mtime) { drive_download(cloud_file, path = local_file_path, overwrite = TRUE) cat("已更新下载:", cloud_file_name, "\n") } else { cat("本地文件已是最新:", cloud_file_name, "\n") } } else { # 本地无此文件,直接下载 drive_download(cloud_file, path = local_file_path) cat("首次下载:", cloud_file_name, "\n") } }
关键说明
- 时区统一:云端返回的
modifiedTime是UTC时区,需转换为本地时区后再与file.mtime()返回的本地时间对比,避免因时区差导致错误判断。 drive_reveal():除了modifiedTime,还可以用该函数获取其他元数据(如createdTime、size等),满足更多对比需求。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

