Discussione:
Errore durante la copia di una cartella
(troppo vecchio per rispondere)
Vincenzo Di Falco
2005-09-11 08:01:40 UTC
Permalink
Mi spiegate una cosa?

Se faccio CopyFolder('C:\pippo\','D:\pippo\'); funziona
invece se faccio CopyFolder(Edit2.Text,Edit3.Text); non mi funziona
eppure
Edit2.Text = 'C:\pippo\' ;
Edit3.Text = 'D:\pippo\' ;

La funzione CopyFolder che uso è la seguente:

function CopyFolder(const fromDir, toDir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_COPY;
fFlags := FOF_FILESONLY;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir)
end;
Result := (0 = ShFileOperation(fos));
end;

L'errore che mi da è il seguente:

"Impossibile copiare File: Imposibile leggere dal file o dal disco di
Origine."

Come mai mi succede questo?

Vincenzo Di Falco

--------------------------------
Inviato via http://arianna.libero.it/usenet/
Jax
2005-09-11 08:29:24 UTC
Permalink
Post by Vincenzo Di Falco
pFrom := PChar(fromDir + #0);
Perché questo + #0 ?
--
Jax
Giorgio Padoan
2005-09-11 09:41:50 UTC
Permalink
Togli il Const nella function CopyFolder, ciao Giorgio
Post by Vincenzo Di Falco
Mi spiegate una cosa?
Se faccio CopyFolder('C:\pippo\','D:\pippo\'); funziona
invece se faccio CopyFolder(Edit2.Text,Edit3.Text); non mi funziona
eppure
Edit2.Text = 'C:\pippo\' ;
Edit3.Text = 'D:\pippo\' ;
function CopyFolder(const fromDir, toDir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
with fos do
begin
wFunc := FO_COPY;
fFlags := FOF_FILESONLY;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir)
end;
Result := (0 = ShFileOperation(fos));
end;
"Impossibile copiare File: Imposibile leggere dal file o dal disco di
Origine."
Come mai mi succede questo?
Vincenzo Di Falco
--------------------------------
Inviato via http://arianna.libero.it/usenet/
Vincenzo Di Falco
2005-09-11 19:06:57 UTC
Permalink
Ho tolto sia
+ #0 come ha detto JAX e

Const come hai detto tu ma l'errore esce sempre, non riesco proprio a capire
da cosa dipende.

Vincenzo Di Falco.

--------------------------------
Inviato via http://arianna.libero.it/usenet/
Mdr
2005-09-12 06:21:01 UTC
Permalink
Post by Vincenzo Di Falco
Ho tolto sia
+ #0 come ha detto JAX e
Const come hai detto tu ma l'errore esce sempre, non riesco proprio a capire
da cosa dipende.
Vincenzo Di Falco.
Ciao, prova così:

procedure EseguiCopia(Sender: TObject; cCartella, cDest: String);
var
Fo : TSHFileOpStruct;
buffer : array[0..4096] of char;
p : pchar;

begin
FillChar(Buffer, sizeof(Buffer), #0);
p := @buffer;
p := StrECopy(p, pChar(cCartella)) + 1;
//p := StrECopy(p, 'C:\DownLoad\2.ZIP') + 1;
//p := StrECopy(p, 'C:\DownLoad\3.ZIP') + 1;
//StrECopy(p, 'C:\DownLoad\4.ZIP');

FillChar(Fo, sizeof(Fo), #0);
Fo.Wnd := Handle;
Fo.wFunc := FO_COPY;
Fo.pFrom := @Buffer;
Fo.pTo := pChar(cDest); //'C:\WINDOWS\TEMP';
Fo.fFlags := FOF_NOCONFIRMATION; //0;
if ((SHFileOperation(Fo) <> 0) or
(Fo.fAnyOperationsAborted <> false)) then
ShowMessage('Cancelled')
end;


Ciao
Micky
--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG
Giorgio
2005-09-12 07:42:49 UTC
Permalink
Il +#0 e' corretto in quanto andrebbe un array di stringhe PChar, che
termina con un altro #0.
Proverei questa cosa che sembra inutile ma che con i componenti VCL a volte
e' necessaria:
Prima prova a togliere il FOF_FILESONLY, Se non va' imposta:

s1,s2: String;
s1:=Edit2.Text;
s2:=Edit3.Text;
...

CopyFolder(s1,s2);


Ciao Giorgio
Post by Vincenzo Di Falco
Ho tolto sia
+ #0 come ha detto JAX e
Const come hai detto tu ma l'errore esce sempre, non riesco proprio a capire
da cosa dipende.
Vincenzo Di Falco.
--------------------------------
Inviato via http://arianna.libero.it/usenet/
Alberto Salvati
2005-09-12 09:59:42 UTC
Permalink
Post by Vincenzo Di Falco
Se faccio CopyFolder('C:\pippo\','D:\pippo\'); funziona
invece se faccio CopyFolder(Edit2.Text,Edit3.Text); non mi funziona
text non è una stringa ma una PROPERTy di tipo string.
prova cosi':


var
Source, Dest: string;

begin
Source := edit1.text;
Dest := edit2.text

CopyFolder(Source, Dest);
...

Alcuni appunti....

1) dai nomi SENSATI agli oggetti
tra 2 secondi ti sarai gia dimenticato cosa contiene edit1 e cosa edit2

2) Assegna un valore a result.
Se la funzione va in errore chissa cosa ti torna indietro....

3) Restituire un boolean nel tuo caso è limitativo.
ShFileOperation non ti da un boolean.
facendo come fai tu sai CHE QUALCOSA NON HA FUNZIONATO, ma non sai
PERCHE' non ha funzionato.
Io la riscriverei in questo modo:


function CopyFolder(const fromDir, toDir: string, var AErrorCode:
integer): Boolean;
var
fos: TSHFileOpStruct;
begin
RESULT := FALSE;
AERRORDCODE := -1;

ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_COPY;
fFlags := FOF_FILESONLY;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir)
end;
AErrorCode := ShFileOperation(fos);
Result := (0 = AErrorCode);
end;

In questo modo, se restituisce false hai il codice dell'errore
restituito da ShFileOperation e puoi scrivere del codice che, in base
ad esso, mostra un messaggio CHIARO, che l'utente possa capire senza
essere costretto a chiamarti:

msg := 'Copia eseguita!';
if Not CopyFolder(a,b, errorcode) then
begin
case ErrorCode of
xx: msg := 'Spazio su disco destinazione insufficiente';
...
end;
end;
ShowMessage(Msg);
..

AS






AS
Vincenzo Di Falco
2005-09-13 15:56:45 UTC
Permalink
Con immenso di spiacere vi comunico che ho eseguito tutte le procedure che
mi avete dato ma il risultato non è cambiato, mi esce sempre il solito
messaggio di errore

"Impossibile copiare File: Imposibile leggere dal file o dal disco di
Origine."

Non so più cosa fare. Sarà un problema del mio PC?

Vincenzo Di Falco

--------------------------------
Inviato via http://arianna.libero.it/usenet/

Continua a leggere su narkive:
Loading...