PDA

Ver la Versión Completa : Mover carpeta y todo su contenido


MaMu
26-05-2007, 23:37:12
Utilizo esta funcion, pero no me funciona, me dice que no se puede leer del Archivo o Carpeta de origen, porque?


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


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:

pTo := PChar(carpetaOrigen);
pFrom := PChar(carpetaDestion+#0#0);

cHackAll
30-05-2007, 02:00:24
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
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
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.......


function MoverCarpeta(const carpetaOrigen,
carpetaDestion: string) : boolean;
.......
.......
pTo := PChar(carpetaOrigen);
pFrom := PChar(carpetaDestion+#0#0);
.......
.......


Salud OS.

cHackAll
30-05-2007, 21:25:48
: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
: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
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
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
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.


SetErrorMode(SEM_FAILCRITICALERRORS);


Saludos!

Keiso
03-06-2007, 05:08:04
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.


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!!!