Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Error en Mover Archivos mediante la Api (https://www.clubdelphi.com/foros/showthread.php?t=75778)

rodno 19-09-2011 14:14:31

Error en Mover Archivos mediante la Api
 
Hola a todos, estoy haciendo una aplicacion que permita mover archivos mediante la Api de windows, utilicé este codigo que postio http://www.delphiaccess.com/forum/tr...os-y-carpetas/ todo funciona muy bien de esta forma: String To="E:\\"; String from="C:\\a.txt"; SHFILEOPSTRUCT FS; ZeroMemory(&FS, sizeof(SHFILEOPSTRUCT)); FS.hwnd = Handle; FS.wFunc = FO_MOVE; FS.pFrom = from.c_str(); FS.pTo = To.c_str();; FS.fFlags = FOF_ALLOWUNDO || FOF_NOCONFIRMATION; SHFileOperation(&FS); Pero cuando lo hago asi: String name_file="a.txt"; String To="E:\\"; String from="C:\\"+name_file; SHFILEOPSTRUCT FS; ZeroMemory(&FS, sizeof(SHFILEOPSTRUCT)); FS.hwnd = Handle; FS.wFunc = FO_MOVE; FS.pFrom = from.c_str(); FS.pTo = To.c_str();; FS.fFlags = FOF_ALLOWUNDO || FOF_NOCONFIRMATION; SHFileOperation(&FS); No funciona, me dice que "no se puede encontrar el archivo de origen", y la ruta hacia el fichero esta bien, comprobando mediante la funcion FileExists(from), el problema siempre me lo da cuando concateno las cadenas. Saludos

Casimiro Notevi 19-09-2011 14:31:19

¡¡¡Mandeee!!! :D

Neftali [Germán.Estévez] 19-09-2011 15:20:05

Normalmente cuando se utilizan rutas hacia ficheros, debes utilizar el path completo.

Es decir, esa ruta:
Código Delphi [-]
Name_file cadena = "a.txt";

Debes colocarla o usarla con el path completo del fichero.

ecfisa 19-09-2011 16:27:41

Hola rodno.

¡ Por favor, usá las etiquetas [delphi] [/delphi] para encerrar el código !

Mirá la diferencia de la legibilidad de tu mensaje con el uso de ellas:

Hola a todos, estoy haciendo una aplicacion que permita mover archivos mediante la Api de windows, utilicé este codigo que postio http://www.delphiaccess.com/forum/tr...os-y-carpetas/
Código Delphi [-]
  String To="E:\\";   
  String from="C:\\a.txt";   
  SHFILEOPSTRUCT FS;   
  ZeroMemory(&FS, sizeof(SHFILEOPSTRUCT));   
  FS.hwnd = Handle;   
  FS.wFunc = FO_MOVE;   
  FS.pFrom = from.c_str();   
  FS.pTo =   To.c_str();;   
  FS.fFlags = FOF_ALLOWUNDO || FOF_NOCONFIRMATION;
  SHFileOperation(&FS);
Pero cuando lo hago asi:
Código Delphi [-]
   
  String name_file="a.txt";   
  String To="E:\\";   
  String from="C:\\"+name_file;   
  SHFILEOPSTRUCT FS;   
  ZeroMemory(&FS, sizeof(SHFILEOPSTRUCT));   
  FS.hwnd = Handle;   
  FS.wFunc = FO_MOVE;  
  FS.pFrom = from.c_str();   
  FS.pTo =   To.c_str();;   
  FS.fFlags = FOF_ALLOWUNDO || FOF_NOCONFIRMATION;
  SHFileOperation(&FS);
No funciona, me dice que "no se puede encontrar el archivo de origen", y la ruta hacia el fichero esta bien, comprobando mediante la funcion FileExists(from), el problema siempre me lo da cuando concateno las cadenas.



Saludos y muchas gracias por tu colaboración.

rodno 19-09-2011 16:50:28

Lo siento de verdad, es que lo postie, y trate de editarlo y cada ves que iba a cargar la pagina no cargaba completa o si no me decia que tenia que esperar mas de 25 minutos. Neftali lo quise decir es que cuando concateno el path del directorio donde se encuentra el fichero y el nombre del fichero es que da el problema

ecfisa 19-09-2011 17:26:11

Hola rodno.

Probá de este modo:
Código:

...
AnsiString name_file = "a.txt";
AnsiString Origen = "C:\\" + name_file;
AnsiString Destino = "E:\\" + name_file;
  SHFILEOPSTRUCT FS;
  ZeroMemory(&FS, sizeof(SHFILEOPSTRUCT));
  FS.hwnd = Handle;
  FS.wFunc = FO_MOVE;
  FS.pFrom = Origen.c_str();
  FS.pTo = Destino.c_str();;
  FS.fFlags = FOF_ALLOWUNDO || FOF_NOCONFIRMATION;
  SHFileOperation(&FS);
...

Saludos

rodno 19-09-2011 18:24:10

nada, sigue con el mismo problema, no se realmente que sucede y cual es el misterio, es que mediante la funcion FileExists me devuelve que si existe el fichero que voy a copiar. saludos y gracias por su interes

ecfisa 19-09-2011 18:37:11

Hola rodno.

El código que te adjunté funciona correctamente.

¿ Estás seguro que el archivo existe y se llama exáctamente así ? ¿ Las unidades y carpetas de origen y destino son correctas ?

Verificá todo eso con el explorador de Windows.

Saludos.

rodno 19-09-2011 18:55:34

Si, todo esta comprobado, haciendolo de esta forma:
Código Delphi [-]
AnsiString Origen = "C:\\a.txt"
si funciona correctamente saludos

escafandra 19-09-2011 20:07:39

Según la documentación de Microsoft, la lista de archivos debe ir, cada archivo separado por un carácter nulo y un doble nulo al final.

Las cadenas en C terminan en un nulo (0) si tratas de sumar a un String un nulo no pasa nada pues para C es una cadena vacía de 0 caracteres. Para conseguir que tus cadenas terminen en doble nulo debes realizar un truco. Si te fijas bien en enlace que diste como referencia te darás cuenta que realiza "algo" con las cadenas antes de usarlas. Otro error que encuentro es que confundes el operador lógico || con el binario |.

Tu código puede quedar así:
Código:

  String name_file="a.txt";
  String To="F:\\;";      // Añado un caracter mas
  String From="C:\\"+name_file+";"; // Añado un caracter mas
  To[To.Length()] = 0;    //Aseguro un nulo al final, el segundo nulo se pondrá con c_str()
  From[From.Length()] = 0; //Aseguro un nulo al final, el segundo nulo se pondrá con c_str()

  SHFILEOPSTRUCT FS;
  ZeroMemory(&FS, sizeof(SHFILEOPSTRUCT));
  FS.hwnd = Handle;
  FS.wFunc = FO_MOVE;
  FS.pFrom = From.c_str();
  FS.pTo = To.c_str();
  FS.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
  SHFileOperation(&FS);

PD: El porqué en ocasiones funcionaba o no, sin estas aclaraciones está en la casualidad de que en el espacio de memoria de tus cadenas se encontraran dos nulos o no...

Saludos.

rodno 19-09-2011 20:53:59

muchas gracias ha funcionado perfecto, otra cosa, sabes que exceptiones puedo capturar para el trabajo con ficheros saludos y gracias

ecfisa 19-09-2011 21:36:27

Hola rodno.

Por favor cuando tengas otra pregunta no relacionada con el tema de un hilo, inicia uno nuevo.

Punto 8 de la Guía de estilo

Cita:

Preguntas que no hay que hacer

He aquí algunos ejemplos de preguntas mal planteadas que seguramente nadie va a responder, por favor te pedimos que no hagas este tipo de preguntas.

1.- Tengo problemas con Delphi ¿puede alguno ayudarme?

2.- ¿Me podéis pasar el crack X?

Cómo ves la primera es insustancial, poco te van a poder ayudar, en cuanto a la segunda, no queremos que el foro se convierta en un lugar de piratas.

Tampoco debes realizar varias preguntas en un mismo hilo, para que te hagas una idea mejor te ponemos un ejemplito...

1.- ¿Cómo podría cambiar las propiedades de una carpeta y de unos archivos para convertirlos en ocultos?

2.- ¿Tiene Delphi alguna función para validar una cadena y saber si su formato es tipo hh:mm:ss?

Son dos temas totalmente distintos, debes abrir un hilo para cada una de ellas, por favor no hagas las dos preguntas en un mismo hilo.

Saludos y gracias por tu colaboración. :)

rodno 19-09-2011 22:03:47

ok, disculpen


La franja horaria es GMT +2. Ahora son las 09:31:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi