Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Flavio Lima_168409

[Resolvido] Copiar arquivos para subpastas através de um filtro

Recommended Posts

Boa tarde a todos, estou precisando de uma ajuda em um aplicativo que estou fazendo, ele filtra o nome dos arquivos e cria pastas na sequencia, o que me resta pra finaliza-lo é jogar os arquivos dentro das pastas correspondentes.

 

1º Esse primeiro script pega a pasta de origem e destino, lista em uma ListBox e cria as pastas.

 

                //Marca o diretório a ser listado
               DirectoryInfo diretorio = new DirectoryInfo(txtEntrada.Text);

               //Executa função GetFile(Lista os arquivos desejados de acordo com o parametro)
               FileInfo[] Arquivos = diretorio.GetFiles("*.*");

               //Começamos a listar os arquivos
               foreach (FileInfo fileinfo in Arquivos)
               {
                   lstXML.Items.Add(fileinfo.Name);

               }

               MessageBox.Show("Pastas criadas com sucesso!");


               foreach (string Items in lstXML.Items)
               {



                   string arquivo = Items;

                   string ano = Items.Substring(2, 2);

                   string mes = Items.Substring(4, 2);

                   string cnpj = Items.Substring(6, 14);

                   txtCNPJ.Text = cnpj;

                   txtAno.Text = ano;

                   txtMes.Text = mes;

                   // Especifica o local da pasta"
                   string activeDir = (txtSaida.Text); 

                   //cria uma nova subpasta
                   string newPath = System.IO.Path.Combine(activeDir, txtCNPJ.Text);

                   // comando que cria a subpasta 
                   System.IO.Directory.CreateDirectory(newPath);

                   //cria uma nova subpasta
                   string Path1 = System.IO.Path.Combine(newPath, txtAno.Text);

                   // comando que cria a subpasta 
                   System.IO.Directory.CreateDirectory(Path1);


                   //cria a segunda subpasta
                   Path2 = System.IO.Path.Combine(Path1, txtMes.Text);

                   // Comando que cria a segunda subpasta
                   System.IO.Directory.CreateDirectory(Path2);



               }

 

 

2º Estou utilizando esse método pra copiar os arquivos para um diretório especifico

 

  private void btnCopiar_Click(object sender, EventArgs e)
       {

           DirectoryInfo pastaOrigem;
           DirectoryInfo pastaDestino;




           //valida se as caixas foram preenchidas
           if (txtEntrada.Text == "" || txtSaida.Text == "")
           {
               MessageBox.Show("Selecione o pasta de origem e pasta de destino", "Erro");
           }
           else
           {
               //verifica se os diretórios são válidos

               pastaOrigem = new DirectoryInfo(txtEntrada.Text);
               pastaDestino = new DirectoryInfo(txtSaida.Text);



               if (!pastaOrigem.Exists)
               {
                   MessageBox.Show("Pasta de origem informada não existe", "Erro");
               }

               else
               {
                   //tudo a partir de agora é feito dentro de um try...catch
                   try
                   {
                       //verifica se a pasta destino é "raiz"
                       if (pastaDestino.Root.Name == pastaDestino.Name)
                       {

                           MessageBox.Show("A pasta destino não pode ser uma pasta raiz", "Erro");


                       }

                       else
                       {
                           //verifica se a pasta "pai" da pasta destino existe

                           if (!pastaDestino.Parent.Exists)
                           {
                               MessageBox.Show("O caminho para a pasta destino não existe", "Erro");
                           }

                           else
                           {


                                   //chama a função que copiará a pasta origem para a pasta destino 
                                   CopiaPasta(pastaOrigem.FullName, pastaDestino.FullName);

                                   MessageBox.Show("Pasta copiada com sucesso!", "Aviso");




                           }

 

 

 

3ºESSE É O MÉTODO CopiaPasta :

 

   void CopiaPasta(string Origem, string Destino)
                                   {
                                            DirectoryInfo pOrigem, pDestino;
                                            pOrigem =new DirectoryInfo(Origem);
                                            pDestino =new DirectoryInfo(Destino);
                                   try
                                   {
                                   //cria o diretório de destino se ele não existir

                                       if(!pDestino.Exists)
                                   {
                                       pDestino.Create();
                                   }
                                       //para cada arquivo na pasta origem copia esse arquivo para a pasta destino

                                         foreach(FileInfo arquivo in pOrigem.GetFiles())
                                   {



                                           arquivo.CopyTo(Path.Combine(pDestino.FullName, arquivo.Name));




                                   }

                                       //para cada pasta na pasta origem copia essa pasta para a pasta destino

                                       foreach(DirectoryInfo pasta in pOrigem.GetDirectories())

                                       {
                                           string strNomeDestino = Path.Combine(pDestino.FullName, pasta.Name);

                                           //chama a função recursivamente
                                           CopiaPasta(pasta.FullName, strNomeDestino);
                                           }

                                           }

                                   catch(Exception objExcessao)
                                           {

                                                 MessageBox.Show(objExcessao.Message,"Erro");

                                           }

                                           }

 

 

POR FIM , agradeceria muito se alguém me desce uma luz para que no 1º Método no btnExportar, quando ele verifica, filtra e cria a pasta já jogar o arquivo lá dentro da ultima subpasta.

OBS: O arquivo seria correspondente as pastas, acredito que teria que criar um filtro tambem pro arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então o que resta agora é assim que ele cria a ultima subpasta jogar o arquivo correspondente dentro dela. Consegui jogar dentro da subpasta todos os arquivos, só não consegui filtrar e envia-los para a pasta correspondentE.

 

Do nome de cada arquivo eu filtro utilizando o método substtring, cnpj, ano, mes.

 

Att

Flávio

Compartilhar este post


Link para o post
Compartilhar em outros sites

As pastas já possuem o filtro e assim que são listadas no listBox são filtradas pelo método substring, e automaticamente organizadas por CNPJ, ANO e MES. Consegui jogar os arquivos pra subpasta MES, porém vão todos os arquivos pra todas as subpastas MES.

 

CNPJ, ANO E MES São definidos pelo nome do arquivo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, acho que a ideia seria você primeiro dividir os arquivos em categorias, CNPJ, ANO, MES e assim vai, primeiro vocêe precisa saber exatamente o que você vai fazer com cada arquivo, tente criar tres rotinas, uma para cada pasta e em cada uma delas você pega o arquivo específico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na pratica eu não tenho nenhum que se adeque aqui, mas vou tentar exemplificar o melhor que puder.

 

Primeiro crie um método que irá separar apenas os CPF's, você pode usar a função para copiar para a pasta para essa finalidade. Modifique algumas partes para que, automaticamente, o programa separe todos os arquivos de CPF e jogue-os em um ArrayList. Creio que você precisará de algum tipo de identificação para isso, algo único que identifique apenas os CPF's e os separe dos demais documentos, assim como para os demais itens.

 

Faça esse mesmo processo para os outros itens, criando outras duas rotinas diferentes.

 

Depois utilize o método que você usou para copiar para as pastas de destino para copiar apenas os itens do arrayList. Você pode criar um método para isso, através de uma function ou sub.

 

public Boolean CopiaPasta(int Type) {
Try{
if(type==<tipo: CPF ou outro>) {

//Rotina para mover os CPF's para a pasta de CPF's
Return True
}

Else if(Type==<outro tipo>){

//Rotina para outro item
Return True
}

Else if(Type==<item>) {

//Outro item

Return True
}

Else {
Return False
}

Catch(Exception e){
Return false
}


}


}

 

 

Você pode criar um enumerador, assim você define numeros especificos para cada tipo de item que tiver:

 

enum Type{CPF=1,Data=2,Ano=3,Mes=4};

 

Ai você só precisa chamar assim:

 

if(Type == Type.CPF){}

 

Depois disso tudo feito, você pode fazer ele executar as tres rotinas e depois chamar este procedimento manualmente para mover para cada pasta. Usando um for para cada arraylist acho que seja possível percorrer tudo e ir criando os arquivos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tendo separado os tres tipos em arraylist crie um enumerador igual ao que eu dei o exemplo, substituindo pelos seus itens, e faça uma sub parecida com a que postei acima.

 

Nesta sub você irá chamar assim:

 

Imaginando que temos o Enum Type:

 

public Boolean MovePasta(suaclasse.Type Tipo) {

if(Tipo == Type.CPF) {
//Código aqui
}

 

 

É só uma maneira de organizar, para não ficar jogando valores numéricos toda vez, o código fica mais legível.

 

No código você usa o mesmo código que você usou para mover os arquivos para as pastas la encima, só que sem a verificação de arquivo, pois você já sabe que tipo de arquivo que você tem e para qual pasta ele vai. Basta movê-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, consegui fazer sem enumerador, fiz um for para a cada arrayList e na sequencia de cada array fui jogando o script de criação de pastas dentro do mesmo foreach e deu certo (:

Obrigado. Só mais um dúvida, como eu posso ignorar os arquivos cujo os nomes possuem simbolos? (no caso estão fora do padrao)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nas hora de mover o arquivo verifique se o nome dele (através do comando arquivo.Contains("String")) contem algum caracter especial, se tiver você pode ou ignorá-lo, passando para o "next" ou então arrumá-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.