Jump to content

C# Cópia de Arquivos em múltiplos diretórios


Felipe Machado
Go to solution Solved by Felipe Machado,

Recommended Posts

 

Boa Dia estou Criando um programa em c# para fazer backup dos arquivos.

mas não estou conseguindo fazer a cópia dos arquivos pois estão em pastas diferentes e não queria cria-las manualmente.

preciso de um código que crie pastas a partir de uma string que é a que está os arquivos.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections;
using System.Diagnostics;

namespace BackupAutomatico
{
    class Program
    {
        static void Main(string[] args)
        {
            Listar();
        }
        private static void Listar()

        {
            //Array que guardara o nome dos arquivos
            ArrayList ArrayLocal = new ArrayList();
            ArrayList ArrayServidor = new ArrayList();
            //Informa o caminho do diretorio
            DirectoryInfo CaminhoLocal = new DirectoryInfo("c:/Lixo/");
            DirectoryInfo CaminhoServidor = new DirectoryInfo("//servidor/base/Backup Teste/");
            // Define o caminho onde os arquivos serão procurados e quais os arquivos a servem procurados
            FileInfo[] ArquivoLocal = CaminhoLocal.GetFiles("*", SearchOption.AllDirectories);
            FileInfo[] ArquivoServidor = CaminhoServidor.GetFiles("*", SearchOption.AllDirectories);
            //Contadores
            int i = 0, a=0;
            foreach (FileInfo arquivo in ArquivoLocal){
                //Adiciona o nome do arquivo em uma posição do array
                ArrayLocal.Add(arquivo.FullName);
                Console.WriteLine(ArrayLocal[i]);
                i++;  
              
                foreach (FileInfo File1 in ArquivoServidor){
                    //Adiciona o nome do arquivo em uma posição do array
                    ArrayServidor.Add(File1.FullName);
                    Console.WriteLine(ArrayServidor[a]);

                    //se o arquivo local do array
                    if (ArrayLocal[i] == ArrayServidor[a]){
                    }
                    else {
                        //Faz a cópia dos arquivos locais para o servidor
                        File.Copy(CaminhoLocal.ToString(), CaminhoServidor.ToString(), true);}
                    }
                    a++;
                } 
            Console.ReadKey();
        }
    }
}

print das pastas existentes

preciso criar essas pastas automaticamente no caminho do servidor "backup teste"

Agradeço desde Já

Link to comment
Share on other sites

Não estou a perceber o teu código.

O teu 2º loop está a adicionar os ficheiros do servidor num array para comparares se é igual ao ficheiro que estás a tentar copiar para quê? Nada te garante mesmo que os dois diretórios sejam iguais que os ficheiros retomados em cada loop serão em sequência, logo, poderás ter os mesmos ficheiros e esse If Else é inútil, além de que estás a usar o File.Copy com a opção de substituir o arquivo se ele existir... por isso, não entendo mesmo o teu código.

Eu removia o teu 2º loop (e até mesmo o 1º, só se quisesses manter um registo de ficheiros transferidos) e usava o File.Copy com o atributo "true" como estás a utilizar, assim, ele copia os ficheiros quer existam quer não.

Se não queres substituir ficheiros existentes, metes false, mas neste caso terás de apanhar as exceções ou então verificar antes se o ficheiro existe com File.Exists e remover o 3º atributo do File.Copy pois não precisas dele.

Link to comment
Share on other sites

  • 1 month later...

Olá Felipe Machado tudo bem?

Cara você fez uma pergunta e foi bombardeado com perguntas e uma analise do seu código( Talvez seja construtivas ), e pelo que pude perceber no texto, não tem a resposta para a pergunta que você fez 🙂 .

Por Favor me corrijam se eu estiver errado.

Olha Felipe como você pediu uma ajuda, e não uma analise do seu código, fiz umas alterações nele e deixei fazendo o que você quer.

Se não me engano, a sua pergunta foi, como criar pastas no destino com base no caminho de origem.
E ai esta a resposta simples e funcional.
Lembrando que este método precisa que o caminho para o server esteja Mapeado.
no meu caso estava mapeado como B:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections;
using System.Diagnostics;

namespace BackupAutomatico
{
    class Program
    {
        static void Main(string[] args)
        {
            Listar();
        }

        private static void Listar()
        {
            //Array que guardara o nome dos arquivos
            ArrayList ArrayLocal = new ArrayList();

            //Informa o caminho do diretorio
            DirectoryInfo CaminhoLocal = new DirectoryInfo("C:/Temp/pasta principal/");

            // Define o caminho onde os arquivos serão procurados e quais os arquivos a servem procurados
            FileInfo[] ArquivoLocal = CaminhoLocal.GetFiles("*", SearchOption.AllDirectories);

            //Contadores
            int i = 0;
            foreach (FileInfo arquivo in ArquivoLocal)
            {
                //Adiciona o nome do arquivo em uma posição do array
                ArrayLocal.Add(arquivo.FullName);
                Console.WriteLine(ArrayLocal[i].ToString());

                // Recebe informações do arquivo a ser copiado 
                FileInfo inforArquivoLocal = new FileInfo(ArrayLocal[i].ToString()); 
              
                // Cria pastas no destino(Servidor) com base nas pastas de origem(Local).
                Directory.CreateDirectory("B:/" + inforArquivoLocal.DirectoryName.Substring(2)); 
                
                //Faz a cópia dos arquivos locais para o servidor
                File.Copy(ArrayLocal[i].ToString(), "B:" + ArrayLocal[i].ToString().Substring(2), true); // Copia o arquivo para criadas anteriormente..

                 i++;
            }
            Console.ReadKey();
        }
    }
}

Print compilação

Edited by OrdnaelAvlis
Adcionar imagem
  • Vote 1
Link to comment
Share on other sites

Eu prefiro tentar perceber o código que o OP fez do que lhe dar o código feito sem ele perceber o porquê, visto que também não está interessado em ajuda ou já copiou outro código na net.

O seu código é bastante frágil, existem funções para obter caminhos no sistema, nomeadamente Environment.GetFolderPath , nada lhe garante que C:\Temp existe.

Não sei também o porquê de usar ArrayList em vez de List Of String, uma vez que só vai guardar texto.

Também atenção onde estás a procurar os ficheiros para copiar, se for na raiz da drive C:/Lixo/ (assumindo que é esta onde está instalada o windows) como referido no OP, é provável que não consigas aceder sem seres administrador.

Não estou aqui só para criticar, mas também não tou aqui para escrever código sem esforço nenhum da vossa parte.

  • Vote 1
Link to comment
Share on other sites

Olá He B TeMy tudo bem?

Peço desculpas pelo meu comentário, é que estou aprendendo a programar ainda.

E como estou aprendendo, nada mais me irrita do que uma resposta que não me dá a resposta.

Citação

Eu prefiro tentar perceber o código que o OP fez do que lhe dar o código feito sem ele perceber o porquê, visto que também não está interessado em ajuda ou já copiou outro código na net.

Não sei se vou dizer besteira, mas é minha opinião.

Se eu quero ajudar, eu não posso colocar mais problemas para a pessoa que já tem um problema, pois vai ser mais uma coisa para ele quebrar cabeça.

Ao invés disto posso dar a resposta pretendida acompanha de comentários, pois assim a pessoa pode ou não se auto ajudar lendo os comentários. 

Copiar da net 🙂 ?  você deve ser experiente, e duvido que as vezes não utiliza desta ferramenta maravilhosa para melhorar, ou ate mesmo para descobrir funcionamento de comandos.

 

Citação

O seu código é bastante frágil, existem funções para obter caminhos no sistema, nomeadamente Environment.GetFolderPath , nada lhe garante que C:\Temp existe.

Não sei também o porquê de usar ArrayList em vez de List Of String, uma vez que só vai guardar texto.

Também atenção onde estás a procurar os ficheiros para copiar, se for na raiz da drive C:/Lixo/ (assumindo que é esta onde está instalada o windows) como referido no OP, é provável que não consigas aceder sem seres administrador.

O código sendo ou não frágil acredito que atendeu o que ele queria, eu poderia sugerir a ele inúmeros comando que fizessem a mesma tarefa, acompanhado de um link a descrever sua funções como você e ele escolheria entre aprender ou só copiar.

A questão do existir ou não o caminho, acho que todos sabem que deve ser feito uma verificação do caminho que pretende copiar.

 

Citação

Não estou aqui só para criticar, mas também não tou aqui para escrever código sem esforço nenhum da vossa parte.

Mais uma vez peço desculpa He B TeMy, eu não quis dizer que você estava só a criticar, eu só questionei o você na sua resposta não tirar a duvida do Felipe.

Espero não geral uma discussão com meus comentários, pois não é a intenção. 

Edited by OrdnaelAvlis
  • Vote 1
Link to comment
Share on other sites

25 minutos atrás, OrdnaelAvlis disse:

Olá He B TeMy tudo bem?

Peço desculpas pelo meu comentário, é que estou aprendendo a programar ainda.

E como estou aprendendo, nada mais me irrita do que uma resposta que não me dá a resposta.

Não sei se vou dizer besteira, mas é minha opinião.

Se eu quero ajudar, eu não posso colocar mais problemas para a pessoa que já tem um problema, pois vai ser mais uma coisa para ele quebrar cabeça.

Ao invés disto posso dar a resposta pretendida acompanha de comentários, pois assim a pessoa pode ou não se auto ajudar lendo os comentários. 

Copiar da net 🙂 ?  você deve ser experiente, e duvido que as vezes não utiliza desta ferramenta maravilhosa para melhorar, ou ate mesmo para descobrir funcionamento de comandos.

 

O código sendo ou não frágil acredito que atendeu o que ele queria, eu poderia sugerir a ele inúmeros comando que fizessem a mesma tarefa, acompanhado de um link a descrever sua funções como você e ele escolheria entre aprender ou só copiar.

A questão do existir ou não o caminho, acho que todos sabem que deve ser feito uma verificação do caminho que pretende copiar.

 

Mais uma vez peço desculpa He B TeMy, eu não quis dizer que você estava só a criticar, eu só questionei o você na sua resposta não tirar a duvida do Felipe.

Espero não geral uma discussão com meus comentários, pois não é a intenção. 

Em relação ao copiar da net, estava-me a referir ao OP, não a si.

O problema de dares o código com comentários é que não vais estar a ajudar a perceber maior parte das vezes, simplesmente alguém pega no código e cola e se funcionar ok se não irão pedir mais ajuda em vez de perceber o porquê de não "funcionar".

Eu não dei mais um problema, eu li o código postado, tentei perceber o que ele estava a fazer no código contraposto ao que ele pretendia, e tentei explicar o que ele deveria ou não fazer tentando melhorar o código postado, como não recebi resposta não pude continuar o raciocínio do OP depois das sugestões que lhe dei, logo, não iria fazer escrever um bloco de código completamente diferente e dar-lhe essa solução para ele simplesmente copiar, porque não para isso que estou aqui nesta secção, existem muitos exemplos online para eu lhe tar a dar mais um sem explicação nem raciocínio nenhum da parte dele, mas estamos a debater isto de mais visto o OP estar fugido.

Em relação ao comentário do C:\Temp\ , assumindo que estamos a falar do diretório %TMP% que pode ser encontrado no \AppData\Local\Temp era que não se deve assumir que esse diretório existe no C:\ , e como se iria precisar do nome de utilizador, em vez de estar a juntar caminhos com possíveis falhas, existem funções para determinar caminhos "especiais" do sistema, tanto como Appdata, Temp, Desktop, Documents , etc, essa função é o Environment.GetFolderPath com a enumeração SpecialFolder

Não precisas de pedir desculpa, eu sei que costumo fazer perguntas sobre o código maior parte das vezes em vez de tentar solucionar o problema, é mais para saber o interesse da pessoa em solucionar o problema sozinha.

Cumprimentos e boa sorte na programação 😉

  • Vote 1
Link to comment
Share on other sites

  • Solution

Calma galerinha, já consegui resolver.

Como tentei explicar no meu post eu queria criar um caminho no servidor(Que não existia com as pastas existentes do c:. exemplo criar pasta no  \\servidor\base\.... através das pastas que estavam localizadas n c: local da minha maquina.).

o código ficou assim

 

 private static void Backup()
        { 
            //declarações
            int i=0,c=0;
            string[] CutServidor, CutLocal;
            string CaminhoDiretorio, CaminhoArquivo, CaminhoCompressao;
            //Array que guardara o nome dos arquivos
            ArrayList ArrayLocal = new ArrayList();
            ArrayList ArrayServidor = new ArrayList();
            //Informa o caminho do diretorio
            //Caminho de destino da pasta ou arquivo
            DirectoryInfo CaminhoLocal = new DirectoryInfo("c:/Lixo");
            //local do caminho onde sera copiado
            DirectoryInfo CaminhoServidor = new DirectoryInfo("//servidor/base/Backup Teste");
            // Define o caminho onde os arquivos serão procurados e quais os arquivos a servem procurados
            FileInfo[] ArquivoLocal = CaminhoLocal.GetFiles("*", SearchOption.AllDirectories);
            FileInfo[] ArquivoServidor = CaminhoServidor.GetFiles("*", SearchOption.AllDirectories);
             //procura os arquivos da pasta determinada automaticamente 
             //se  houver outras pastas dentro da string CaminhoLocal ele pesquisa autimaticamente e cria se houver pastas
            foreach (FileInfo arquivo in ArquivoLocal)
            {
                //Adiciona o nome do arquivo em uma posição do array
                ArrayLocal.Add(arquivo.FullName);
                //"corta" a string e separa pelo / 
                CutServidor = CaminhoServidor.ToString().Split('/');
                //"corta" a string e separa pelo / 
                CutLocal = ArquivoLocal[i].Directory.ToString().Split('\\');
                // a partir do contador "c" pego a quantidade de vetores dentro da string 
                c = CutLocal.Count();
                //caminho onde será comprimido o arquivo "Transformado em .zip"
                
                //verifica qual a quantidade de vetores na string para criar o caminho até o servidor
                if (c == 4){
                    //cria um caminho para o servidor com todas as pastas e com o nome do arquivo
                    CaminhoArquivo = "\\\\" + CutServidor[2] + "\\" + CutServidor[3] + "\\" + CutServidor[4] + "\\" + CutLocal[2] + "\\" + CutLocal[3] + "\\" + ArquivoLocal[i];
                    //cria um caminho para o servidor com todas as pastas
                    CaminhoDiretorio = "\\\\" + CutServidor[2] + "\\" + CutServidor[3] + "\\" + CutServidor[4] + "\\" + CutLocal[2] + "\\" + CutLocal[3];
                    
                }
                else if (c == 6){
                    //cria um caminho para o servidor com todas as pastas e com o nome do arquivo
                    CaminhoArquivo = "\\\\" + CutServidor[2] + "\\" + CutServidor[3] + "\\" + CutServidor[4] + "\\" + CutLocal[2] + "\\" + CutLocal[3] + "\\" + CutLocal[4] + "\\" + CutLocal[5] + "\\" + ArquivoLocal[i];
                    //cria um caminho para o servidor com todas as pastas
                    CaminhoDiretorio = "\\\\" + CutServidor[2] + "\\" + CutServidor[3] + "\\" + CutServidor[4] + "\\" + CutLocal[2] + "\\" + CutLocal[3] + "\\" + CutLocal[4] + "\\" + CutLocal[5];
                }
                else{
                    //cria um caminho para o servidor com todas as pastas e com o nome do arquivo
                    CaminhoArquivo = "\\\\" + CutServidor[2] + "\\" + CutServidor[3] + "\\" + CutServidor[4] + "\\" + CutLocal[2] + "\\" + CutLocal[3] + "\\" + CutLocal[4] + "\\" + ArquivoLocal[i];
                    //cria um caminho para o servidor com todas as pastas
                    CaminhoDiretorio = "\\\\" + CutServidor[2] + "\\" + CutServidor[3] + "\\" + CutServidor[4] + "\\" + CutLocal[2] + "\\" + CutLocal[3] + "\\" + CutLocal[4];
                }
                
                //verifica se o diretorio existe até a pasta verificada a partir da string CaminhoDiretorio
                if (Directory.Exists(CaminhoDiretorio))
                {
                }   else {
                        //cria o diretorio a partir da string CaminhoDiretorio
                        DirectoryInfo di = Directory.CreateDirectory(CaminhoDiretorio);
                    }
                //verifica se o arquivo existe no caminho a partir da string CaminhoArquivo
                if (File.Exists(CaminhoArquivo) == true)
                {
                    Console.WriteLine("Arquivo ja Copiado");
                }
                    else { 
                         try
                         {
                             //copia os arquivos para o diretorio da string CaminhoArquivo
                             File.Copy(ArquivoLocal[i].FullName.ToString(), CaminhoArquivo, true); 
                         }
                         //verifica se ocorreu erro na execução da cópia
                         catch (Exception e)
                         {
                             //escreve na tela o erro se houver
                             Console.WriteLine(e);
                         }
                    }
                //incrementa o contador
                i++;
                CaminhoCompressao = "\\\\" + CutServidor[2] + "\\" + CutServidor[3] + "\\" + CutServidor[4]; 
            }
        }

usei o método .split para separar a source do caminho através do '\\' agradeço a ajuda de todos 😄

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.