Newsgroup: it.comp.lang.delphi
Titolo: Problemi con ShFileOperation

Girando per il newsgroup mi sono imbattuto in un'api che agisce su piu' 
file contemporaneamente. Il problema che mi si presenta e' che a volte si 
rifiuta di funzionare.
Questo e' il codice:
procedure TFConv.DeleteOldBookmark;
var
  lpFileOp: TSHFileOpStruct;
begin
  FillChar(lpFileOp, SizeOf(TSHFileOpStruct), #0);
  lpFileOp.Wnd:=Application.Handle;
  lpFileOp.wFunc:=FO_DELETE;
  lpFileOp.pFrom:=PChar(EDir+'*.*');
  ShFileOperation(lpFileOp);
end;
Quando chiamo questa funzione in EDir (che e' una variabile globale perche' 
mi serve anche in altri punti del programma) ho la directory iniziale da 
dove iniziare ad importare i bookmark. Le situazioni che ricorrono piu' 
spesso sono (indicando con (Preferiti$) la cartella dei Preferiti di 
Windows, visto che dipende dalla versione):
1. EDir = (Preferiti$)+'\'
2. EDir = (Preferiti$)+'\Collegamenti\'
3. EDir = (Preferiti$)+'\Collegamenti\Opera bookmark\'
Nei casi 1 e 3 funziona perfettamente. Nel primo mi dice:
Impossibile eliminare File: Impossibile leggere dal file o dal disco 
origine
Qualcuno mi sa dire perche'?
Grazie.
-- 
Ciao,
   Stefano

origine
Se dici che funziona "a volte", non e' che hai questi file gia' aperti in background
da qualche altro software? dovresti controllare il codice di errore di sistema.
da li capisci se il file e' in uso, bloccato da altri programmi, ecc...
Ciao
--
Buon      .-""",
 Natale    /____, \
          {_____}`{} 
Buone    (/ . . \)
 Feste   {`-=^=-`}
         {   `   }
          {     }jgs
Morde.     `-,-`

origine
Secondo le specifiche di SHFileOperation, il parametro pFrom (cosi`
come pTo) devono puntare a zone di memoria "double-null terminated"
che quindi finiscono per #0#0.

 bloccato da altri programmi, ecc... 
"A volte" nel senso che dipende dalla directory. Per il resto la situazione 
e' deterministica: se voglio importare i bookmark nella cartella 
Collegamenti mi dice che c'e' un errore (e ho fatto girare il programma 
mentre girava solo lui sotto Delphi piu' antivirus e firewall, ho chiuso 
pure il client di posta!), altrimenti (nel senso delle altre directory che 
ho provato) gli va bene. Gli va bene anche se la directory e' vuota.
-- 
Ciao,
   Stefano

Andrea Laforgia wrote:

Ora ci provo.
Se cosi' fosse sarebbe strano che negli altri casi funziona.
-- 
Ciao,
   Stefano

 Se cosi' fosse sarebbe strano che negli altri casi funziona.
CVD: funziona.
Ora non mi spiego perche' prima in alcuni casi andasse. Devo considerare le 
volte che faceva quello che gli dicevo un errore del programma? O__o
-- 
Ciao,
   Stefano

volte che faceva quello che gli dicevo un errore del programma? O__o
Il concetto di "funzionamento", in programmazione, e` molto
particolare.  A volte, e` un caso che il programma funzioni.
Nel tuo caso particolare (vuoi per il sistema che inizializza, in
determinate condizioni, la memoria a zero, vuoi per pura fortuna) e`
probabile che i buffer da te utilizzati e terminanti con uno zero
singolo, si trovassero, per caso appunto, uno zero seguente, in
memoria, e quindi gli zeri diventavano 2.  In altri casi questo non
succedeva e da qui il malfunzionamento.

 particolare.
*Estremamente* particolare.
Grazie per l'assistenza.
-- 
Ciao,
   Stefano

Morde wrote:
[CUT]
Grazie per il suggerimento.
-- 
Ciao,
   Stefano