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)
-   -   Mover carpeta y todo su contenido (https://www.clubdelphi.com/foros/showthread.php?t=44042)

MaMu 26-05-2007 23:37:12

Mover carpeta y todo su contenido
 
Utilizo esta funcion, pero no me funciona, me dice que no se puede leer del Archivo o Carpeta de origen, porque?

Código Delphi [-]
function MoverCarpeta(const carpetaOrigen,
  carpetaDestion: string) : boolean;
var
  FileOp: TSHFileOpStruct;
begin
  FillChar(FileOp, SizeOf(FileOp), #0);
  with FileOp do
  begin
    wFunc := FO_MOVE;
    Wnd := GetDesktopWindow;
    pTo := PChar(carpetaOrigen);
    pFrom := PChar(carpetaDestion+#0#0);
    fFlags := FOF_NOCONFIRMATION or
      FOF_SILENT or FOF_ALLOWUNDO;
  end;
  Result := (ShFileOperation(FileOp) = 0);
end;

Y la llamada es

Código Delphi [-]
procedure TMain.Button1Click(Sender: TObject);
var dir,name,dest,root:string;
begin
 root:=ExtractFilePath(Application.ExeName);
 dir:=root+'SvrDirectory\';
 dest:=root+'SvrHistory\';
 name:=ADOQuery1.FieldByName('carpeta').AsString;
 if ADOQuery1.RecordCount>0
   then begin
    //Muevo Dir
     if MoverCarpeta(dir+name,dest+name) 
       then 
     //Borra Dir
    // DeleteDir(dir+name);
       end;    
    ADOQuery1.Delete;
     ADOQuery1.Close;
     ADOQuery1.Open;
   end;
end;

seoane 27-05-2007 00:10:58

Hombre, si no recuerdo mal mis clases de ingles, esto esta mal:
Código Delphi [-]
    pTo := PChar(carpetaOrigen);
    pFrom := PChar(carpetaDestion+#0#0);

cHackAll 30-05-2007 02:00:24

JEje
 
jejej, no pude contenerme! no es el caso pero la observacion hace notar un pequeño BUG de "dedo"

MaMu 30-05-2007 19:06:15

Cita:

Empezado por cHackAll
jejej, no pude contenerme! no es el caso pero la observacion hace notar un pequeño BUG de "dedo"

:D jejejejejejejeje

egostar 30-05-2007 19:49:17

Cita:

Empezado por cHackAll
jejej, no pude contenerme! no es el caso pero la observacion hace notar un pequeño BUG de "dedo"

:D:D:D, Pero un BUG de "dedo" bien manejado.......

Código Delphi [-]
function MoverCarpeta(const carpetaOrigen,
  carpetaDestion: string) : boolean;
.......
.......
    pTo := PChar(carpetaOrigen);
    pFrom := PChar(carpetaDestion+#0#0);
.......
.......

Salud OS.

cHackAll 30-05-2007 21:25:48

Sucede
 
:D Cuando mis programas sufren de ese BUG me da ganas de llorar luego de pasar horas buscando la falla entre centenares de lineas!

Pero estuvo muy jocosa la observacion de las "clases de Ingles"... jejeje

Saludos!

seoane 30-05-2007 21:49:13

Cita:

Empezado por cHackAll
:D Cuando mis programas sufren de ese BUG me da ganas de llorar luego de pasar horas buscando la falla entre centenares de lineas!

Pero estuvo muy jocosa la observacion de las "clases de Ingles"... jejeje

Saludos!

No era mi intención ser jocoso, solo quería remarcar, quizá con demasiada ironía, que el parámetro pFrom se corresponde con la carpeta de origen y pTo con la de destino, justamente al revés de como estaba colocado. La verdad es que no me había fijado en como estaba escrito "carpetaDestion".

JuanErasmo 31-05-2007 16:21:05

pero algunas veces deja copiar y otras no...
 
Hola Domingo, y amigos,
yo utilizo esa funcion, para copiar archivo, y algunas veces tambien me sale ese error,
Algunas veces utilizo mejor TMemoryStream, primero load file, y luego saveto, asi es para copiar, pero lo mejor es hacerlo como dice Domingo,
Como se evita ese error de NO SE PUEDE LEER EL DISPOSITIVO?
cuando esta ocupado por otro proceso, no se deja copiar, es claro, que no cortar, perooo deberia dejarse copiar,,,,
Gracias

Lepe 31-05-2007 17:28:54

Cita:

Empezado por JuanErasmo
perooo deberia dejarse copiar,,,,
Gracias

No tiene por qué, si el proceso está escribiendo en ese archivo, no debe dejar leer tampoco.

cHackAll 31-05-2007 21:51:08

Continua el problema?
 
No soy muy íntimo de ShFileOperation, pero creo que es una API bastante interesante!

El error inicial del hilo era el error de "dedo" verdad? o me equivoco. Ahora si les aparece algunos errores de dispositivo u otro por qué no intentan poner antes la siguiente linea... talvez les sea útil.

Código Delphi [-]
SetErrorMode(SEM_FAILCRITICALERRORS);

Saludos!

Keiso 03-06-2007 05:08:04

Esto te puede servir
 
Todo este código es pura API y me funciona muy bien con archivos y carpetas, "origen" y "destino" son strings globales y en la Uses añadir ShellApi.

Código Delphi [-]
procedure CopyProc;
var StructFile: _SHFILEOPSTRUCT;
begin
 if destino <> "" then
 // llenamos la estructura StructFile
  begin
   StructFile.Wnd:= 0;
   StructFile.wFunc:= FO_MOVE;
   StructFile.pFrom:= PChar(origen + #0);
 // #0 es importante o no copiará algunos archivos
   StructFile.pTo:= destino;
   StructFile.fFlags:= FOF_SIMPLEPROGRESS;
   StructFile.lpszProgressTitle:= PChar(origen + '  a  ' + destino);
   if SHFileOperation(StructFile) = 0 then
    MessageBox(0,'Copiado','OK',0);
   else
    MessageBox(0,'No copiado','Error',MB_ICONHAND);
  end
 else
   MessageBox(hMain,'Se debe seleccionar una carpeta de destino','Error',MB_ICONEXCLAMATION);
end;

Saludos!!!


La franja horaria es GMT +2. Ahora son las 14:35:00.

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