Copying files with the same name to a directory without overwriting (R!)

3

Hello, I have a problem.

I have a dummy directory that contains a set of folders, each folder inside it contains a protocol folder, and inside each folder I have one or more files. Ex:

  Pasta    Protocolo     Arquivo(s)
    A    ->    1     ->     x  
    B    ->    2     ->     y  
    C    ->    1     ->     z , x  

My challenge is to transfer protocol folders to a new directory and place the files inside those folders without overwriting them. So the ideal result would be:

   Protocolo     Arquivo(s)
       1     ->     x (1) , x (2) , z  
       2     ->     y  

The folder and protocol are broken down into a df (test), so I'm creating these directories with a loop:

for (i in 1:3){ 
print(i)
  pasta_to <- paste("F:/", 
                    test$pasta[i], sep="/")

  # Cria o diretório se ele não existe

  ifelse(!dir.exists(pasta_to), 
         dir.create(pasta_to, recursive=TRUE), FALSE)

  pasta_from = paste("C:/Meus Documentos/destino", 
                     test$pasta_origem[i], 
                     test$pasta_do_anexo_resposta[i], 
                     sep="/")  

  files_from <- list.files(pasta_from)
  path_from <- paste(pasta_from, files_from, sep="/")
  file.copy(from=path_from, to = pasta_to, overwrite = F)
  } 

With this code it ends up overwriting files with the same name x:

   Protocolo     Arquivo(s)
       1     ->     x  , z  
       2     ->     y  

How do I not overwrite files?

    
asked by anonymous 07.06.2018 / 20:00

1 answer

1

Jessica, how are you?

It is not that file.copy() ends up overwriting the files with the same name. On the contrary, it does NOT overwrite files with the same name, since you set overwrite = F .

One possible but painstaking solution is to create a function that compares the list of files in the source folder with the list of files in the destination folder. If there are files with the same name, change the name, for example put a suffix to differentiate. Then yes, after that execute the file.copy() .

Let's go to the solution:

# Definindo as pastas de origem e destino
path_origem <- "C:/origem"
path_destino <- "C:/destino"

# Função que verifica se existe algum arquivo com o mesmo nome entre as duas listas
verifica.repetido <- function(origem, destino) {
  if(length(setdiff(lista_origem, lista_destino)) != length(origem)) {
    return(TRUE)
  } else {
    return(FALSE)
  }
}

# Função que adiciona "#" no nome do arquivo de origem, para diferenciar do de destino
renomeia <- function(origem, destino, path_origem) {
  for (i in 1:length(origem)) {
    for (j in 1:length(destino)) {
      if (origem[i] == destino[j]) {
        novo_nome = gsub("\.", "#.", origem[i])
        file.rename(from = paste(path_origem, origem[i], sep = "/"),
                    to = paste(path_origem, novo_nome, sep = "/"))
      }
    }
  }
  return(origem)
}

# Obtendo a lista de arquivos das pastas de origem e destino
lista_origem <- list.files(path_origem)
lista_destino <- list.files(path_destino)

# Verificando se há algum nome repetido entre as listas
repetido <- verifica.repetido(lista_origem, lista_destino)

# Se houver repetido, o laço abaixo executa até que não haja mais nenhum repetido
repeat{
  renomeia(lista_origem, lista_destino, path_origem)
  lista_origem <- list.files(path_origem)
  repetido <- verifica.repetido(lista_origem, lista_destino)
  if(!repetido) {
      break
    }
}

# Incluindo o caminho completo da pasta de origem
lista_origem <- list.files(path_origem, full.names = T)

# Colando os arquivos de origem na pasta de destino
file.copy(from = lista_origem, to = path_destino)

I'm sure there is a less laborious way, but anyway, this way you can paste as many times as necessary, in the destination folder, files with already existing names. The only thing that will happen is the addition of the # character at the end of the file.

    
07.06.2018 / 22:23