Felipe Machado Posted January 9, 2017 at 12:59 PM Report Share #601907 Posted January 9, 2017 at 12:59 PM 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 More sharing options...
He B TeMy Posted January 12, 2017 at 01:27 PM Report Share #601965 Posted January 12, 2017 at 01:27 PM 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 More sharing options...
OrdnaelAvlis Posted February 19, 2017 at 09:22 PM Report Share #602624 Posted February 19, 2017 at 09:22 PM (edited) 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 February 19, 2017 at 09:35 PM by OrdnaelAvlis Adcionar imagem 1 Report Link to comment Share on other sites More sharing options...
He B TeMy Posted February 19, 2017 at 09:51 PM Report Share #602625 Posted February 19, 2017 at 09:51 PM 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. 1 Report Link to comment Share on other sites More sharing options...
OrdnaelAvlis Posted February 20, 2017 at 02:25 PM Report Share #602637 Posted February 20, 2017 at 02:25 PM (edited) 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 February 20, 2017 at 02:26 PM by OrdnaelAvlis 1 Report Link to comment Share on other sites More sharing options...
He B TeMy Posted February 20, 2017 at 03:05 PM Report Share #602641 Posted February 20, 2017 at 03:05 PM 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 😉 1 Report Link to comment Share on other sites More sharing options...
Solution Felipe Machado Posted February 20, 2017 at 04:58 PM Author Solution Report Share #602642 Posted February 20, 2017 at 04:58 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now