文档章节

检查目录是否存在,如果不存在则创建

j
 javail
发布于 02/23 18:22
字数 1131
阅读 111
收藏 0

我经常发现自己写的R脚本会产生大量输出。 我发现它更干净,可以将此输出放到自己的目录中。 我在下面编写的内容将检查目录是否存在并移入该目录,或者创建目录然后移入该目录。 有没有更好的方法来解决这个问题?

mainDir <- "c:/path/to/main/dir"
subDir <- "outputDirectory"

if (file.exists(subDir)){
    setwd(file.path(mainDir, subDir))
} else {
    dir.create(file.path(mainDir, subDir))
    setwd(file.path(mainDir, subDir))

}

#1楼

就一般体系结构而言,我建议在目录创建方面采用以下结构。 这将涵盖大多数潜在的问题,并且dir.create调用将检测到目录创建的其他任何问题。

mainDir <- "~"
subDir <- "outputDirectory"

if (file.exists(paste(mainDir, subDir, "/", sep = "/", collapse = "/"))) {
    cat("subDir exists in mainDir and is a directory")
} else if (file.exists(paste(mainDir, subDir, sep = "/", collapse = "/"))) {
    cat("subDir exists in mainDir but is a file")
    # you will probably want to handle this separately
} else {
    cat("subDir does not exist in mainDir - creating")
    dir.create(file.path(mainDir, subDir))
}

if (file.exists(paste(mainDir, subDir, "/", sep = "/", collapse = "/"))) {
    # By this point, the directory either existed or has been successfully created
    setwd(file.path(mainDir, subDir))
} else {
    cat("subDir does not exist")
    # Handle this error as appropriate
}

还要注意,如果~/foo不存在,则除非指定recursive = TRUE否则对dir.create('~/foo/bar') recursive = TRUE将失败。


#2楼

要找出路径是否为有效目录,请尝试:

file.info(cacheDir)[1,"isdir"]

file.info不在意最后的斜线。

如果目录中以斜杠结尾,则Windows上的file.exists将失败,如果没有该目录,则成功。 因此,这不能用于确定路径是否为目录。

file.exists("R:/data/CCAM/CCAMC160b_echam5_A2-ct-uf.-5t05N.190to240E_level1000/cache/")
[1] FALSE

file.exists("R:/data/CCAM/CCAMC160b_echam5_A2-ct-uf.-5t05N.190to240E_level1000/cache")
[1] TRUE

file.info(cacheDir)["isdir"]

#3楼

从2015年4月16日开始,随着R 3.2.0的发布,有一个名为dir.exists()的新函数。 要使用此功能并创建目录(如果目录不存在),可以使用:

ifelse(!dir.exists(file.path(mainDir, subDir)), dir.create(file.path(mainDir, subDir)), FALSE)

如果目录已经存在或无法创建,则返回FALSE如果目录不存在但创建成功,则返回TRUE

请注意,只需检查目录是否存在,即可使用

dir.exists(file.path(mainDir, subDir))

#4楼

在原始文章中,使用file.exists()来测试目录是否存在是一个问题。 如果subDir包含现有文件的名称(而不只是路径),file.exists()将返回TRUE,但是对setwd()的调用将失败,因为您无法将工作目录设置为指向文件。

我建议使用file_test(op =“-d”,subDir),如果subDir是现有目录,它将返回“ TRUE”,但是如果subDir是现有文件或不存在的文件或目录,则返回FALSE。 同样,可以使用op =“-f”完成文件检查。

此外,如另一条评论中所述,工作目录是R环境的一部分,应由用户而不是脚本控制。 理想情况下,脚本不应更改R环境。 为了解决这个问题,我可以使用options()将全局存储的目录存储在我想要所有输出的位置。

因此,请考虑以下解决方案,其中someUniqueTag只是选项名称的程序员定义的前缀,这使得不太可能已经存在具有相同名称的选项。 (例如,如果要开发一个名为“ filer”的软件包,则可以使用filer.mainDir和filer.subDir)。

以下代码将用于设置以后可在其他脚本中使用的选项(从而避免在脚本中使用setwd()),并在必要时创建文件夹:

mainDir = "c:/path/to/main/dir"
subDir = "outputDirectory"

options(someUniqueTag.mainDir = mainDir)
options(someUniqueTag.subDir = "subDir")

if (!file_test("-d", file.path(mainDir, subDir)){
  if(file_test("-f", file.path(mainDir, subDir)) {
    stop("Path can't be created because a file with that name already exists.")
  } else {
    dir.create(file.path(mainDir, subDir))
  }
}

然后,在需要在subDir中操作文件的任何后续脚本中,都可以使用类似以下内容的代码:

mainDir = getOption(someUniqueTag.mainDir)
subDir = getOption(someUniqueTag.subDir)
filename = "fileToBeCreated.txt"
file.create(file.path(mainDir, subDir, filename))

该解决方案将工作目录置于用户的控制之下。


#5楼

我遇到了R 2.15.3的问题,当尝试在共享网络驱动器上递归创建树结构时,会出现权限错误。

为了避免这种怪异,我手动创建了结构。

mkdirs <- function(fp) {
    if(!file.exists(fp)) {
        mkdirs(dirname(fp))
        dir.create(fp)
    }
} 

mkdirs("H:/foo/bar")

本文转载自:https://ja.sofbug.com/question/Hgy9

j
粉丝 8
博文 1584
码字总数 0
作品 0
深圳
私信 提问
linux安装mysql5.7.19

1:下载 2:解压文件 3修改文件 4:检查库文件是否有删除,若有便删除(linux系统自带的) 5:检查mysql组和用户是否存在,如无创建

yzbty23
2018/07/02
12
0
你应该这个姿势学习PHP(4)

1)fopen(path,′xx′)打开一个文件xx=r是以只读的方式打开并将指针指向头部xx=r+读写方式打开xx=w写入方式,并清空文件内容,指针执行头部,不存在则创建xx=w+读写方式,后面同上xx=a写入方...

思梦教育
2018/06/26
0
0
koa-body 文件上传自定义文件夹及文件名称

一、需求 二、实现 三、效果 四、只保存需要的文件路径 五、示例代码 一、需求 本篇文章基于之前的文件续写, 因此一些基的使用需要参照下面的文章内容,不在重复基本代码 之前写了一篇文章,...

飞翔的熊blabla
2019/01/23
0
0
如何修改Jupyter Notebook的默认路径

本文基于Windows 10系统,其他版本及类型的操作系统未测试过,不过设置方法可能类似。 安装Anaconda以及jupyterlab之后,jupyterlab默认的路径为当前用户的用户路径,一般在C:Users[usernam...

杨梅泡酒
2019/03/28
0
0
CentOS 自动备份增量文件

还是利用crontab功能,这个功能太实用了,赞一个先 利用人家的备份脚本: #!/bin/bash #好的做法 #根据项目不同来重命名该脚本 #例如 amountebak.sh or pandawillsbak.sh #该脚本最好放在 $b...

鉴客
2010/09/12
1.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

定时器Timer和TimerTask

为什么要使用定时器呢? 比如说一个web应用,如果这个应用规模很大,那它的日志数据是不是很多。如果一直存下来服务器的存储量怕是不行吧,需要隔一段时间删除,那么就需要一个线程每隔一段时...

南柯好萌
34分钟前
18
0
深圳创服机构创成汇投融资对接指南

深圳创服机构创成汇投融资对接指南 一线城市一直是许多创业者创业热土,深圳也不例外,作为发达城市,科技是深圳的标志,也是许多科技创业者向往之地,科技创业者在创业前期面临许多难题,其...

cchlin
47分钟前
35
0
egg学习笔记第六天:使用中间件屏蔽可疑用户

站点有时候想屏蔽一些特定频繁抓取服务器数据的用户,可以放在中间件中去做,用户在指定Ip数组内,则屏蔽,如果不在,则匹配路由规则执行controller。 中间件的概念: 匹配路由前,匹配路由完...

一生懸命吧
51分钟前
34
0
005-其他技巧

css精灵图(css雪碧)sprites 减少服务器接收和发送请求的次数,提高页面加载速度 原理:将网页中的一些小背景图整合到一张大图中 使用background-position移动背景图位置-x/y坐标 字体图标ico...

沉默的懒猫
56分钟前
15
0
YouTube视频下载:Airy for mac

想在YouTube下载视频?借助适用于Mac的AIry YouTube下载程序,您可以获得一个简单而高效的下载程序,可以在瞬间处理来自YouTube的任何曲目或播放列表。只需找到您要下载的视频,选择格式和分...

MacW软件分享
今天
38
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部