• Sábado 27 de Abril de 2024, 23:26

Autor Tema:  Problemas Funcion Copyfile Del Winapi  (Leído 3677 veces)

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Problemas Funcion Copyfile Del Winapi
« en: Jueves 15 de Noviembre de 2007, 13:57 »
0
Buenas, mi cuestion es muy sencilla, de hecho no tarde en encontrar la solucion, pero me esta dando mas problemas de la cuenta el tema.
Bueno, el tema es que necesiaba copiar un archivo de un directorio a otro diferente, entonces encontre la funcion "Copyfile" del Winapi de Windows, perfecto, porque ya usaba el Winapi en otros aspectos de mi aplicacion.

Hasta aqui todo bien, probe la funcion asi
Código: Text
  1. CopyFile("c:\\a.jpg","c:\\carpeta\\bb.jpg",true);
  2.  
y funcionó perfecto.

En este punto fue cuando me decidi a implementarla en mi codigo, lo que queria hacer era sencillo, seleccionaba un archivo de mi disco duro usando el dialogo "openFile" , una vez seleccionado me devolvia la ruta del archivo en la variable "szFile", y con esa ruta ya podría copiar el archivo donde quisiera (o eso pensé yo)
Código: Text
  1.  
  2. HWND hDlg;
  3. openFile(hDlg);
  4. CopyFile(szFile,"c:\\carpeta\\bb.jpg",true);
  5.  
  6.  
Una cosa así es el código que uso, pero para sorpresa mía, no me copia el archivo donde le digo, osea que no hace nada, he comprobado el contenido de "szFile" y es correcto, por lo que nose por donde atacar ya.

Perdón por el tocho, pero prefiero hacer un post largo y explicar bien mi problema.

Gracias de antemano, y espero vuestras sugerencias!!!!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #1 en: Jueves 15 de Noviembre de 2007, 14:07 »
0
¿Que valor devuelve GetLastError despues de CopyFile?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #2 en: Jueves 15 de Noviembre de 2007, 14:30 »
0
¿Como se usa la funcion GetLastError? Estoy buscando por la red y no veo nada claro.
Código: Text
  1. DWORD err=GetLastError();
  2.  
¿Asi valdría?

Usandolo así el valor que me devuelve es 32  :blink: .

¿Es correcto? Me parece un numero de codigo de error bastante bajito...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #3 en: Jueves 15 de Noviembre de 2007, 14:41 »
0
Es correcto y 32 es:
The process cannot access the file because it is being used by another process.

Si estas abriendo el archivo sin permisos de lectura compartida en la funcion openFile es logico que pase esto. Podes cerrarlo ya que no creo que lo necesites despues o abrirlo con FILE_SHARE_READ.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #4 en: Jueves 15 de Noviembre de 2007, 16:06 »
0
Y yo que pensaba que con esa funcion solo obtenia la ruta del fichero, que no lo habría realmente, uso esta funcion para abrir el cuadro de dialogo y seleccionar el fichero:

Código: Text
  1. int openFile(HWND hwnd)
  2. {
  3. //Declaraciones
  4. OPENFILENAME ofn;       // common dialog box structure
  5. //HWND hwnd;              // owner window
  6. HANDLE hf;              // file handle
  7. int i;
  8.  
  9. //Limpia la var.
  10. for (i=0;i<260;i++){
  11.     szFile[i]='\0';
  12. }
  13. // Inicializa OPENFILENAME
  14. ZeroMemory(&ofn, sizeof(ofn));
  15. ofn.lStructSize = sizeof(ofn);
  16. ofn.hwndOwner = hwnd;
  17. ofn.lpstrFile = szFile;
  18. //
  19. // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
  20. // use the contents of szFile to initialize itself.
  21. //
  22. ofn.lpstrFile[0] = '\0';
  23. ofn.nMaxFile = sizeof(szFile);
  24. ofn.lpstrFilter = "Imágenes\0*.JPG;*.BMP\0Videos\0*.AVI\0";
  25. ofn.nFilterIndex = 1;
  26. ofn.lpstrFileTitle = NULL;
  27. ofn.nMaxFileTitle = 0;
  28. ofn.lpstrInitialDir = NULL;
  29. ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  30.  
  31. // Display the Open dialog box.
  32. if (GetOpenFileName(&ofn)==TRUE)
  33.     hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
  34.         0, (LPSECURITY_ATTRIBUTES) NULL,
  35.         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
  36.         (HANDLE) NULL);
  37. return 0;
  38. }
  39.  

¿Como podría cerrarlo despues de tener la ruta?

Mil gracias por tu ayuda.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #5 en: Jueves 15 de Noviembre de 2007, 16:18 »
0
hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
       0, (LPSECURITY_ATTRIBUTES) NULL,
       OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
       (HANDLE) NULL);


Ahi lo estas abriendo. Si nunca vas a usar el archivo excepto en la copia entonces no lo abras y listo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #6 en: Jueves 15 de Noviembre de 2007, 16:33 »
0
Listo, muchisimas gracias:

Aqui mostraba en Cuadro de Diagolo para seleccionar el archivo del HD, y GENERIC_READ, me habria el archivo.

Código: Text
  1. hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
  2. 0, (LPSECURITY_ATTRIBUTES) NULL,
  3. OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
  4. (HANDLE) NULL);
  5.  

Ahora he sustituido el GENERIC_READ por un 0, y no lo habre ahora.
Eso no lo entendia, estoy empezando con la API en C++.

Saludos, y hasta la próxima.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #7 en: Jueves 15 de Noviembre de 2007, 16:39 »
0
Cita de: "Escalona"
Ahora he sustituido el GENERIC_READ por un 0, y no lo habre ahora.
Eso no lo entendia, estoy empezando con la API en C++.

Saludos, y hasta la próxima.
¿En vez de no llamar a CreateFile lo llamas con parametros incorrectos? ¿Estas seguro de que no lo abre? ¿Comprobaste el valor de hf?

De cualquiera manera: ¿Te parece que esa es una solucion logica? ¿No es mejor simplemente NO intentar abrir un archivo que nunca usas? Y para el futuro cuando abras un archivo cerralo (CloseHandle).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #8 en: Jueves 15 de Noviembre de 2007, 16:51 »
0
Bueno "creo" que no lo habre, ya que me deja manipularlo despues, la cosa es que si elimino la funcion CreateFile , programa deja de  mostrarme el OpenDialog Box y no me serviria.

O sea que segun me dices es mejor dejar el GENERIC_READ, pero cerrarlo cuando termine de cojer el path del fichero, ¿no?.

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #9 en: Jueves 15 de Noviembre de 2007, 16:56 »
0
Jajajaja, bueno no me grites muy fuerte, ahora lo entiendo (o eso creo).

La funcion para abrir en OpenDialog Box es "GetOpenFileName()"; ¿no?,
ahora he quitado el CreateFile, y me sirve perfectamente.

Gracias por tu paciencia!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Funcion Copyfile Del Winapi
« Respuesta #10 en: Jueves 15 de Noviembre de 2007, 16:59 »
0
Cita de: "Escalona"
Jajajaja, bueno no me grites muy fuerte, ahora lo entiendo (o eso creo).

La funcion para abrir en OpenDialog Box es "GetOpenFileName()"; ¿no?,
ahora he quitado el CreateFile, y me sirve perfectamente.

Gracias por tu paciencia!
Si y no, GetOpenFileName lo que hace es mostrar ese cuadro donde seleccionas el archivo, no hace falta abrirlo en ningun momento.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.