none
Copiar archivos de una carpeta a otra

    Question

  • Hola, necesito hacer algo y queria ver si me pueden dar una idea de como hacerlo.

    Quiero copiar todos los archivos y carpetas con archivos que hay en la ubicación donde esté el ejecutable de la aplicación que estoy creando con c#, a otra ubicación que yo selecciono.

    Por ejemplo, si el ejecutable esta en D:, quiero copiar todo lo que haya en D: a otra ubicacion que despues yo elijo.

    La cosa, es que me gustaría darle al usuario alguna informacion de que se estan copiando los archivos, ya sea la cantidad, o los MB que ocupa. Por ejemplo, "se esta copiando archivo 1 de 10"  e ir avanzando progresivamente, o algo por el estilo.

    Hay alguna opción que me permita monitorear eso? o debería hacerlo a mano, haciendo primero una lista de todo lo que se va a copiar y despues ir incrementando un contador?

    Friday, October 29, 2010 3:03 PM

Answers

  • Hola, Drakenan!

     

    Para eso que necesitas puedes usar la clase DirectoryInfo.  En la siguiente página encontrarás información y Links de ejemplos.

     

    http://msdn.microsoft.com/es-es/library/system.io.directoryinfo(VS.80).aspx

     

    En la siguiente página se trata el tema de mostrar el progreso de copia de un archivo:

     

    http://www.recursosvisualbasic.com.ar/htm/listado-api/65-copiar-archivo-progreso.htm

     

    Espero te sea de utilidad.

     

    Bendiciones!


    Si la respuesta te es de utilidad, recuerda marcarla como Respuesta y/o votarla como Útil. Así colaboras a que el foro esté organizado.
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 3:36 PM
  • hola

    revisa el segundo ejemplo planteado, vera sle metodo CopyAll() que realiza esta operacion

    C# Copy Folder Recursively

    para informar podrias an cada iteracion del loop agregar una linea en algun control StatusBar, para informar el avance

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 4:35 PM
  • Hola Drakenan,

     

    Claro que eso es posible!, como comentaba el compañero AlexLander puedes usar la clase DirectoryInfo para ayudarte con eso, 

    DirectoryInfo source = new DirectoryInfo(sourceFolder);
    // el método GetFiles obtiene todos los archivos de un folder especifico, 
    // incluso puedes poner un filtro a que archivos te traiga, como por ejemplo
    // todos los archivos *.png o *.txt
    FileInfo[] filesToCopy = source.GetFiles();
    foreach (FileInfo file in filesToCopy)
    {
      file.CopyTo(destinationFolder + "\\" + file.Name);
      Console.WriteLine(String.Format("File {0} moved to {1}", file.FullName, destinationFolder));
    }
    Console.WriteLine("Task finished!");
    Console.ReadKey();
    
    Espero haber sido de ayuda,


    -- Thank you, Alejandro Carmona Software Engineer Microsoft VIP | México
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 4:58 PM
  • hola

    es que deberias realizar una operacion previa al copiado del archivo, no se si habras visto que cuando copias en el "Windows Explorer" antes de emepzar este muestra una leyenda que dice "preparando para copia" o algo asi

    bueno durante ese tiempo calcula la cantidad de archivos y el tamaño total

    esto mismo deberas replziarlo, realziando el mismo loop que usas para copiar solo que lo haria smas directo consultando y sumando la propeidad "Count" de la coleccion de archivos

    de este calculo previos sabras la cantidad total de archivos que debes copiar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 5:30 PM

  • el loop = foreach, o sea por loop me referia a cada iteracion del foreach

    aunque en realdiad podras sumaricar los archivos


    private int CountAll(DirectoryInfo source)
    {
        integer cantarchivos = 0;

        cantarchivos = source.GetFiles().Count

        foreach(DirectoryInfo diSourceSubDir in source.GetDirectories())
        {
            CountAll(diSourceSubDir);
        }
       
        return cantarchivos;
    }

    Nota, no probe el codigo, puede que requiera algunos ajustes, pero la idea es contar recursivo, los mismos archivos que luegos copiaras

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 5:51 PM

All replies

  • Hola, Drakenan!

     

    Para eso que necesitas puedes usar la clase DirectoryInfo.  En la siguiente página encontrarás información y Links de ejemplos.

     

    http://msdn.microsoft.com/es-es/library/system.io.directoryinfo(VS.80).aspx

     

    En la siguiente página se trata el tema de mostrar el progreso de copia de un archivo:

     

    http://www.recursosvisualbasic.com.ar/htm/listado-api/65-copiar-archivo-progreso.htm

     

    Espero te sea de utilidad.

     

    Bendiciones!


    Si la respuesta te es de utilidad, recuerda marcarla como Respuesta y/o votarla como Útil. Así colaboras a que el foro esté organizado.
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 3:36 PM
  • muchas gracias, pero el ejemplo que me pasaste es en visual basic, lo necesito en c#.

     

    En cuanto a copiar un archivo, vi ejemplos de como hacerlo pero tengo que especificar el archivo origen y el path destino. ¿no se puede hacer que copie absolutamente todo lo que encuentre en una carpeta origen, y la copie tal cual exactamente a una carpeta destino? para no tener que andar especificando uno por uno.

    Friday, October 29, 2010 4:23 PM
  • hola

    revisa el segundo ejemplo planteado, vera sle metodo CopyAll() que realiza esta operacion

    C# Copy Folder Recursively

    para informar podrias an cada iteracion del loop agregar una linea en algun control StatusBar, para informar el avance

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 4:35 PM
  • Hola, Drakenan!

     

    Puedes convertir cualquier código de VB a C# en la siguiente página:

     

    http://www.elguille.info/NET/WebServices/deVBaCS_web.aspx

     

    Es muy útil.   Prúebala y verás!

     

    Bendiciones!


    Si la respuesta te es de utilidad, recuerda marcarla como Respuesta y/o votarla como Útil. Así colaboras a que el foro esté organizado.
    Friday, October 29, 2010 4:41 PM
  • Hola Drakenan,

     

    Claro que eso es posible!, como comentaba el compañero AlexLander puedes usar la clase DirectoryInfo para ayudarte con eso, 

    DirectoryInfo source = new DirectoryInfo(sourceFolder);
    // el método GetFiles obtiene todos los archivos de un folder especifico, 
    // incluso puedes poner un filtro a que archivos te traiga, como por ejemplo
    // todos los archivos *.png o *.txt
    FileInfo[] filesToCopy = source.GetFiles();
    foreach (FileInfo file in filesToCopy)
    {
      file.CopyTo(destinationFolder + "\\" + file.Name);
      Console.WriteLine(String.Format("File {0} moved to {1}", file.FullName, destinationFolder));
    }
    Console.WriteLine("Task finished!");
    Console.ReadKey();
    
    Espero haber sido de ayuda,


    -- Thank you, Alejandro Carmona Software Engineer Microsoft VIP | México
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 4:58 PM

  • gracias a todos por responder. Logré hacer la primera parte que es copiar todos los archivos y carpetas de un directorio a otro.

    Con el tema del progressbar, hago otra pregunta: ¿se puede contar la cantidad de archivos de un directorio, incluyendo los que haya en subdirectorios? Asi con ese número podría ponerlo como valor máximo en el progress bar e ir incrementandolo a medida que copie cada archivo.

    Use esto:

    MessageBox.Show(Covert.ToString(di.GetFileSystemInfo().Length));

    Pero el numero que me da no es correcto.

    y si uso el GetFiles().Length me tira solo los archivos del primer directorio, sin tomar en cuenta los de los subdirectorios.
    Friday, October 29, 2010 5:23 PM
  • hola

    es que deberias realizar una operacion previa al copiado del archivo, no se si habras visto que cuando copias en el "Windows Explorer" antes de emepzar este muestra una leyenda que dice "preparando para copia" o algo asi

    bueno durante ese tiempo calcula la cantidad de archivos y el tamaño total

    esto mismo deberas replziarlo, realziando el mismo loop que usas para copiar solo que lo haria smas directo consultando y sumando la propeidad "Count" de la coleccion de archivos

    de este calculo previos sabras la cantidad total de archivos que debes copiar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 5:30 PM
  • Hola,

    Podrias usar este método para obtener la cantidad de archivos totales en un directorio (incluyendo los subdirectorios)

    FileInfo[] filesToCopy = source.GetFiles("*", SearchOption.AllDirectories);
    
    Donde defines un searchPattern que incluye todos los archivos y un SearchOption.AllDirectories


    -- Thank you, Alejandro Carmona Software Engineer Microsoft VIP | México
    Friday, October 29, 2010 5:34 PM
  • no entendi muy bien que loop me decis. Usé esta función, y lo que pretendía era sumar uno en la progress bar en donde pongo la linea de asteriscos:

     

    Lo unico que necesitaría es saber cual es el numero de archivos que hay en el directorio, incluyendo los subdirectorios, asi lo pongo en la propiedad Maxium del progress bar. ¿se puede hacer esa cuenta?

     

      public
     static
     void
     CopyAll(DirectoryInfo source, DirectoryInfo target)
    {
    if (source.FullName.ToLower() == target.FullName.ToLower())
    {
    return ;
    }

    // Check if the target directory exists, if not, create it.
    if (Directory.Exists(target.FullName) == false )
    {
    Directory.CreateDirectory(target.FullName);
    }

    // Copy each file into it's new directory.
    foreach (FileInfo fi in source.GetFiles())
    {
    Console.WriteLine(@"Copying {0}\{1}" , target.FullName, fi.Name);
    fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true );
    ****************ACA SUMAR UNO A PROGRESS BAR*****************
    }

    // Copy each subdirectory using recursion.
    foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
    {
    DirectoryInfo nextTargetSubDir =
    target.CreateSubdirectory(diSourceSubDir.Name);
    CopyAll(diSourceSubDir, nextTargetSubDir);
    }
    }
    Friday, October 29, 2010 5:40 PM

  • el loop = foreach, o sea por loop me referia a cada iteracion del foreach

    aunque en realdiad podras sumaricar los archivos


    private int CountAll(DirectoryInfo source)
    {
        integer cantarchivos = 0;

        cantarchivos = source.GetFiles().Count

        foreach(DirectoryInfo diSourceSubDir in source.GetDirectories())
        {
            CountAll(diSourceSubDir);
        }
       
        return cantarchivos;
    }

    Nota, no probe el codigo, puede que requiera algunos ajustes, pero la idea es contar recursivo, los mismos archivos que luegos copiaras

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Drakenan Friday, October 29, 2010 7:32 PM
    Friday, October 29, 2010 5:51 PM
  • Habia interpretado cualquier cosa de tu respuesta leandro...  hice la funcion recursiva tal como dices. Aca pongo el codigo por si le sirve a alguien:

     

                //LLAMAR A: CALCULAR CANTIDAD DE ARCHIVOS A COPIAR
                DirectoryInfo diOrigen = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
                CalcularCantidadArchivosACopiar(diOrigen);

                MessageBox.Show(Convert.ToString(Cantidad));




    //LA FUNCION

            private void CalcularCantidadArchivosACopiar(DirectoryInfo DirectorioOrigen)
            {
                Cantidad = Cantidad + DirectorioOrigen.GetFiles().Count();

                foreach (DirectoryInfo SubDirectorio in DirectorioOrigen.GetDirectories())
                {
                    CalcularCantidadArchivosACopiar(SubDirectorio);           
                }

            }

    Friday, October 29, 2010 7:31 PM
  • En este PDF te explica lo de crear binario y leerlo.

     

    http://electronica-pic.blogspot.com/2010/05/introduccion-visual-c-2005-express.html

     

    Saludo.


    Friday, October 29, 2010 8:27 PM