Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-09-2011
rodno rodno is offline
Miembro
 
Registrado: feb 2009
Posts: 23
Poder: 0
rodno Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 19-09-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¡¡¡Mandeee!!!
Responder Con Cita
  #3  
Antiguo 19-09-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 19-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 19-09-2011
rodno rodno is offline
Miembro
 
Registrado: feb 2009
Posts: 23
Poder: 0
rodno Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 19-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 19-09-2011
rodno rodno is offline
Miembro
 
Registrado: feb 2009
Posts: 23
Poder: 0
rodno Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 19-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 19-09-2011
rodno rodno is offline
Miembro
 
Registrado: feb 2009
Posts: 23
Poder: 0
rodno Va por buen camino
Si, todo esta comprobado, haciendolo de esta forma:
Código Delphi [-]
AnsiString Origen = "C:\\a.txt"
si funciona correctamente saludos
Responder Con Cita
  #10  
Antiguo 19-09-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 19-09-2011 a las 20:20:05.
Responder Con Cita
  #11  
Antiguo 19-09-2011
rodno rodno is offline
Miembro
 
Registrado: feb 2009
Posts: 23
Poder: 0
rodno Va por buen camino
muchas gracias ha funcionado perfecto, otra cosa, sabes que exceptiones puedo capturar para el trabajo con ficheros saludos y gracias
Responder Con Cita
  #12  
Antiguo 19-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #13  
Antiguo 19-09-2011
rodno rodno is offline
Miembro
 
Registrado: feb 2009
Posts: 23
Poder: 0
rodno Va por buen camino
ok, disculpen
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mover archivos y deletar carpeta Paulao Varios 15 20-07-2011 15:57:54
mover varios archivos jpg a otra carpeta ingmichel Internet 3 10-06-2011 16:44:59
Copiar/Mover archivos lbidi API de Windows 1 05-10-2010 20:18:56
Descargar archivos mediante un formulario pampitasnowman PHP 17 15-05-2007 16:39:04
preguntar por archivos mediante NMFTP carlosegs Internet 1 25-04-2006 23:27:01


La franja horaria es GMT +2. Ahora son las 18:39:34.


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
Copyright 1996-2007 Club Delphi