123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- #' Reorganise MODIS Files in Local Data Archive
- #'
- #' @description
- #' Re-organise the storage structure of your MODIS archive according to the
- #' settings in \code{options("MODIS_arcStructure")}. Depending on the specified
- #' \code{'source'} , you can also use this function to gather all MODIS grid
- #' files on you computer and reorganise them. The main purpose is to organise
- #' the archive, but it is also possible to copy a subset of files to a
- #' desidered location!
- #'
- #' @param from \code{character}. Local path to look for MODIS files, defaults to
- #' \code{options("MODIS_localArcPath")} (see \code{\link{MODISoptions}}).
- #' @param to \code{character}. Target folder to move (or copy) MODIS files to,
- #' defaults to \code{options("MODIS_localArcPath")}.
- #' @param structure \code{character}. Storage structure, defaults to
- #' \code{options("MODIS_arcStructure")} (see Examples).
- #' @param pattern Regular expression passed to \code{\link{list.files}}. Insert
- #' a pattern if you want to extract specific files from your archiv.
- #' @param move \code{logical}. If \code{TRUE} (default), files are moved and
- #' duplicated files are deleted. If \code{FALSE}, files are just copied and thus
- #' remain in the origin folder. Note that the copying process performs rather
- #' slowly when dealing with large files, e.g. 250-m 'MOD13Q1'.
- #' @param quiet \code{logical}, defaults to \code{FALSE}.
- #'
- #' @return
- #' If \code{quiet = FALSE}, information on how many files have been moved (or
- #' copied) and deleted is printed to the console.
- #'
- #' @author
- #' Matteo Mattiuzzi
- #'
- #' @examples
- #' \dontrun{
- #' # MOVE all MODIS grid data to the directory and structure as defined in
- #' # options("MODIS_localArcPath", "MODIS_arcStructure")
- #' orgStruc(move = TRUE)
- #'
- #' # COPY all MOD13Q1 from 2001 to folder "MyFiles/MOD13Q1.collection/"
- #' orgStruc(pattern="MOD13Q1.A2001*.",to="MyFiles",structure="PRODUCT.CCC")
- #'
- #' # COPY all MOD13Q1 to folder "MyFiles/"
- #' orgStruc(pattern="MOD13Q1.*.",to="MyFiles",structure="")
- #' }
- #'
- #' @export orgStruc
- #' @name orgStruc
- orgStruc <- function(from,to,structure, pattern, move=FALSE, quiet=FALSE)
- {
-
- opts <- combineOptions()
- if (missing(from))
- {
- from <- opts$localArcPath
- }
-
- if (missing(to))
- {
- to <- opts$localArcPath
- }
- to <- setPath(to)
-
- if (!missing(structure))
- {
- opts$acrStructure <- structure
- }
- ###########################
-
- if(missing(pattern))
- {
- cat(paste0("No 'pattern' set, moving/coping all MODIS grid data found in '", from,"'.\n"))
- avFiles <- unlist(list.files(from, pattern=".hdf$", recursive=TRUE, full.names=TRUE))
- } else
- {
- avFiles <- unlist(list.files(from, pattern=pattern, recursive=TRUE, full.names=TRUE))
- }
-
- if (length(avFiles)==0) {stop("No HDF nor HDF.XML files found!\n")}
- doit <- isSupported(avFiles)
- if (sum(doit)==0) {stop("No supported files Found")}
- avFiles <- avFiles[doit]
-
- if (!quiet)
- {
- cat("Found",length(avFiles),"files \n")
- }
- #########################
- moved <- sapply(avFiles,function(x)
- {
- orpath <- correctPath(dirname(x))
- fname <- basename(x)
- ########################
- # generate and create local path to file!
- path <- genString(x=fname,remote=FALSE,localArcPath=to)$localPath
- dir.create(path,showWarnings=FALSE,recursive=TRUE)
- ###################
-
- if (!file.exists(file.path(path,fname,fsep="/")))
- { # if file doesn't exist in destdir copy/move
- if (move)
- {
- file.rename(from=x,to=paste0(path,fname))
- if (file.exists(paste0(x,".xml")))
- {
- file.rename(from=paste0(x,".xml"),to=paste0(path,fname,".xml",sep=""))
- }
- moved <- 1
- } else
- {
- file.copy(from=x,to=paste0(path,fname),overwrite=FALSE)
- if (file.exists(paste0(x,".xml")))
- {
- file.copy(from=paste0(x,".xml"),to=paste0(path,fname,".xml"))
- }
- moved <- 2
- }
- } else if (file.exists(file.path(path,fname,fsep="/")) & orpath!=path)
- { # if file exists in destdir & inpath!=outPath...it is duplicated in 2 different locations, so remove it
- unlink(x)
- if (file.exists(paste0(x,".xml")))
- {
- unlink(paste0(x,".xml"))
- }
- moved <- 3
- } else
- {
- moved <- 0
- }
- if (length(list.files(orpath))==0)
- {
- if (.Platform$OS=="unix")
- { # I'm looking for a windows/MAC(?) eqal to the linux "rmdir -p" command!!
- warn <- getOption("warn")
- options(warn=-2)
- try(xxx <- invisible(system(paste0("rmdir -p --ignore-fail-on-non-empty ", orpath),intern=TRUE)),silent=TRUE)
- options(warn=warn)
- } else
- { # work around for rmdir -p on windows/MAC(?)
- unlink(orpath,recursive=TRUE)
- secPath <- strsplit(orpath,"/")[[1]]
-
- for (o in length(secPath):1)
- {
- delpath <- paste0(secPath[-o:-length(secPath)],collapse="/")
- if (length(list.files(delpath))==0)
- {
- unlink(delpath,recursive=TRUE)
- } else
- {
- break
- }
- }
- }
- }
- return(moved)
- })
- if (sum(moved==0)==length(avFiles))
- {
- cat("All files in the query are fine, no files to move or to copy!\n")
- } else
- {
- cat("Moved files", sum(moved==1),"\n")
- cat("Copied files", sum(moved==2),"\n")
- cat("Not moved files", sum(moved==0),"\n")
- cat("Deleted multiple files", sum(moved==3),"\n")
- }
- }
|