441 votes

Vérifier l'existence du répertoire et créer s'il n'existe pas

Je me retrouve souvent à écrire des scripts R qui génèrent beaucoup de résultats. Je trouve cela plus propre de mettre cette sortie dans son propre répertoire (s). Ce que j'ai écrit ci-dessous va vérifier l'existence d'un répertoire et y accéder, ou créer le répertoire, puis y accéder. Y a-t-il une meilleure façon d'aborder cela?

 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))

}
 

440voto

robbrit Points 7531

Utilisez showWarnings = FALSE :

 dir.create(file.path(mainDir, subDir), showWarnings = FALSE)
setwd(file.path(mainDir, subDir))
 

dir.create() ne plante pas si le répertoire existe déjà, il imprime simplement un avertissement. Donc, si vous pouvez vivre avec voir des avertissements, il n'y a pas de problème avec cela:

 dir.create(file.path(mainDir, subDir))
setwd(file.path(mainDir, subDir))
 

17voto

zelanix Points 372

En termes d'architecture générale, je recommanderais la structure suivante en ce qui concerne la création d'annuaire. Cela couvrira la plupart des problèmes potentiels et tout autre problème lié à la création d'un répertoire sera détecté par l'appel 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
}
 

Sachez également que si ~/foo n'existe pas, un appel à dir.create('~/foo/bar') échouera sauf si vous spécifiez recursive = TRUE .

2voto

user3807179 Points 1

Pour savoir si un chemin est un répertoire valide, essayez:

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

file.info ne se soucie pas d'une barre oblique à la fin.

file.exists sur Windows échouera pour un répertoire s'il se termine par une barre oblique, et réussit sans lui. Donc, cela ne peut pas être utilisé pour déterminer si un chemin est un répertoire.

 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"]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X