Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Copiar Ficheros

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Copiar Ficheros Responder citando

Hola!!

Estoy usando esta función que la copié de lo que algún compañero dejo en una respuesta (Víktor, creo, y sino que me disculpe el interesado, que no me acuerdo):

void __fastcall CopiarCarpeta(AnsiString Origen, AnsiString Destino)
{
SHFILEOPSTRUCT sfos;

ZeroMemory(&sfos, sizeof(sfos));
sfos.hwnd = NULL;
sfos.wFunc = FO_COPY;
ShowMessage(Origen);
sfos.pFrom = Origen.c_str();
sfos.pTo = Destino.c_str();
sfos.fFlags = FOF_NOCONFIRMMKDIR | FOF_NOCONFIRMATION;
SHFileOperation(&sfos);
}


Cuando se llama a esta funcion asi:

CopiarCarpeta("C:\\fichero1.txt","E: \\fichero1.txt");

La función hace la copia. Pero si se le llama intentando copiar desde un directorio, da un error:

CopiarCarpeta("C:\\Programas\\fichero1.txt","E:\\fichero1.txt");

Dice "que no puede copiar el archivo: No se puede leer el disco o archivo de origen".

Sin embargo si le llama así:

CopiarCarpeta("C:\\Programas\\*.txt","E:\\");

Entonces funciona perfectamente. ¿Alguien sabe que puede estar pasando?. Quiero usar esta función por que aparece la ventana de copia de ficheros y eso me resulta muy útil.

Gracias!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Según la referencia del API, como en el origen se pueden especificar más de un archivo, estos deben estar separados por un carácter nulo ('\0') y la lista debe estar acabada en doble carácter nulo. Uno ya se añade automáticamente al terminar la cadena, falta por añadir uno más.

Modifica la función del siguiente modo:
Código:
void __fastcall CopiarCarpeta(AnsiString Origen, AnsiString Destino)
{
    SHFILEOPSTRUCT sfos = {0,};
    ZeroMemory(&sfos, sizeof(sfos));
    sfos.hwnd = NULL;
    sfos.wFunc = FO_COPY;

      // Añadimos estas dos líneas
      Origen.SetLength(Origen.Length()+1);
      Origen[Origen.Length()] = '\0';

    sfos.pFrom = Origen.c_str();
    sfos.pTo = Destino.c_str();
    sfos.fFlags = FOF_NOCONFIRMMKDIR | FOF_NOCONFIRMATION;
    SHFileOperation(&sfos);
}

Otro ejemplo:
https://cppbuilder.es/viewtopic.php?t=617
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Un millón de gracias Leo!!!!.

Lo que yo había intentado era:
Origen += "\0";
Y también:
Origen = Origen + "\0";

Y cosas de este estilo (antes de llamar a la función por ejemplo). Como no me funcionaba tampoco, lo dejé, suponiendo que no era eso.
Ahora ya funciona.
Olé, maestro!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.