You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中从FTP批量下载HDF文件:按链接命名及批量下载目录文件

解决方案:批量下载FTP服务器上的HDF文件

一、从指定URL列表批量下载并保留原文件名

针对已有明确HDF文件URL列表的场景,可通过循环自动提取文件名并完成批量下载:

# 定义待下载的FTP URL列表
ftp_urls <- c(
  "ftp://username:password@ftppath/File#1_hh_mm_ss.HDF",
  "ftp://username:password@ftppath/File#2_hh_mm_ss.HDF",
  "ftp://username:password@ftppath/File#3_hh_mm_ss.HDF"
)

# 循环遍历URL,自动提取文件名并下载
for (url in ftp_urls) {
  # 从URL中提取原始文件名
  dest_file <- basename(url)
  # 下载二进制格式的HDF文件,需指定mode="wb"避免文件损坏
  download.file(url, destfile = dest_file, mode = "wb")
  cat("已完成下载:", dest_file, "\n")
}

如果偏好tidyverse风格的简洁写法,可使用purrr包:

library(purrr)

walk(ftp_urls, ~{
  dest_file <- basename(.x)
  download.file(.x, destfile = dest_file, mode = "wb")
  cat("已完成下载:", dest_file, "\n")
})

二、按不同FTP账号下载对应目录下所有HDF文件

针对多账号、需批量抓取目录内所有HDF文件的场景,推荐使用RCurl包实现更灵活的FTP操作:

# 安装RCurl(首次使用时执行)
# install.packages("RCurl")
library(RCurl)

# 定义多组FTP服务器配置(用户名、密码、目标目录)
ftp_servers <- list(
  list(
    user = "username1",
    pass = "password1",
    dir = "ftp://ftppath/"  # 目录URL末尾需加/
  ),
  list(
    user = "username2",
    pass = "password2",
    dir = "ftp://ftppath/"
  )
)

# 遍历每组FTP配置,批量下载目录内所有HDF文件
for (server in ftp_servers) {
  # 设置FTP连接选项
  ftp_opts <- curlOptions(
    userpwd = paste0(server$user, ":", server$pass),
    ftp.use.epsv = FALSE  # 适配部分不支持EPSV模式的FTP服务器
  )
  
  # 获取目标目录下的所有文件名列表
  file_list_str <- getURL(
    server$dir,
    .opts = ftp_opts,
    ftplistonly = TRUE  # 仅获取文件名,不返回文件内容
  )
  
  # 拆分字符串得到单个文件名,并筛选出.HDF后缀的文件
  file_names <- strsplit(file_list_str, "\n")[[1]]
  hdf_files <- grep("\\.HDF$", file_names, value = TRUE)
  
  # 批量下载筛选后的HDF文件
  for (file in hdf_files) {
    full_url <- paste0(server$dir, file)
    download.file(
      full_url,
      destfile = file,
      mode = "wb",
      extra = paste0("--user ", server$user, ":", server$pass)
    )
    cat("已完成下载:", file, "(账号:", server$user, ")\n")
  }
}

关键注意事项

  • HDF为二进制文件,下载时必须指定mode="wb",否则文件可能损坏
  • 若URL包含#等特殊字符出现下载失败,可先用URLencode(url)对URL编码后再使用
  • 若遇到FTP连接超时,可在curlOptions中添加connecttimeout=30延长超时时间

内容的提问来源于stack exchange,提问作者S_Av

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:40:24