Entwickler-Ecke

Dateizugriff - Problem beim Ordner verschieben


Gausi - So 14.11.04 19:18
Titel: Problem beim Ordner verschieben
Durch den vielen Code eine lange Beschreibung, aber ein an und für sich einfaches Problem...hoffe ich.
Ich mache folgendes. Mein Programm erhält per Drag&Drop vom Explorer ein paar Ordner, um sie zu untersuchen. Dafür nehme ich folgenden Code (im wesentlichen hier aus dem Forum):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
Procedure TForm1.WMDropFiles (Var aMsg: tMessage);
Var
  Idx,
  Size,
  FileCount: Integer;
  Filename: pChar;
  neuesAlbum:Talbum;
Begin
    Inherited;
    FileCount := DragQueryFile (aMsg.WParam, $FFFFFFFFnil255);
    For Idx := 0 To FileCount -1 Do
    Begin
        Size := DragQueryFile (aMsg.WParam, Idx, nil0) + 1;
        Filename := StrAlloc (Size);
        If DragQueryFile (aMsg.WParam, Idx, Filename, Size) = 1 Then
        { nothing } ;
        neuesAlbum:=TAlbum.Create;
        (neuesAlbum.OrdnerInfo as TOrdner).pfad:=pChar(Filename);
        // Ordnerdetails bestimmen, z.B. Groesse, Anzahl Dateien etc.
        Albumdetails(pChar(Filename),neuesAlbum);
        ListBox1.Items.AddObject (pChar(Filename),neuesAlbum);
        StrDispose (Filename);
    End;
    DragFinish (aMsg.WParam);
End;

Den Ordner untersuche ich folgendermaßen (aufs wesentliche reduziert):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
Procedure TForm1.Albumdetails(Path: String;album:TAlbum);
var sr : TSearchrec;
    dateityp:string;
    mpegInfo:TMpegINfo;
    ID3v2Tag:TID3V2Tag;
    ID3v1tag:TID3v1Tag;
begin
    if findfirst(Path+'\*',FaAnyfile,sr) = 0 then
    repeat
        if (sr.name<>'.'AND (sr.name<>'..'then
        begin
            // Datei untersuchen
            dateityp:=AnsiLowerCase(ExtractFileExt(sr.Name));
            if dateityp='.mp3' then
                mp3Info(Path+'\'+sr.name,mpegInfo,ID3v2Tag,ID3v1Tag);
        end;
    until Findnext(sr)<>0;
    if findfirst(Path+'\*',FaDirectory,sr)=0 then
    repeat
        if (sr.name<>'.'AND (sr.name<>'..'then
            Albumdetails(Path+'\'+sr.name,Album);
    until Findnext(sr)<>0;
    findclose(sr);
end;

die Procedure mp3info liest aus dem mp3file diverse Daten aus. Welche das sind, sollte anhand der Parameter klar sein...

Anschließend wählt das Programm ein paar dieser Ordner/Alben nach gewissen Kriterien aus. Diese sollen dann in einen anderen, neuen Ordner verschoben werden. Dafür habe ich diese Funktion (auch hier ausm Forum):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function MoveDir(const fromDir, toDir: string): Boolean;
var    
  fos: TSHFileOpStruct;    
begin    
  ZeroMemory(@fos, SizeOf(fos));
  with fos do    
  begin    
    wFunc  := FO_MOVE;    
    fFlags := FOF_FILESONLY;    
    pFrom  := PChar(fromDir + #0);    
    pTo    := PChar(toDir)    
  end;    
  Result := (0 = ShFileOperation(fos));    
end;


Und jetzt zu dem Problem: Beim Verschieben kommt die Fehlermeldung:
"Der Ordner xy kann nicht entfernt werden: Die Datei wird von einer anderen Person bzw. einem anderen Programm verwendet."
Das ist aber nicht der Fall. Einzige Möglichkeit ist, dass mein Programm den Ordner noch verwendet. Aber ich sehe nicht, wieso.

Ergebnis sind dann leere verbleibende Ordner. Die einzelnen Dateien/Unterordner wurden korrekt verschoben - nur werden die Ursprungsordner nicht entfernt.


Gausi - Mo 15.11.04 21:51

Hat sich erledigt. Hab den Fehler gefunden. In der Prozedur, mit der ich die Ordner rekursiv durchsuche, hab ich zweimal ein FindFirst drin, ober nur ein FindClose :autsch:


Jakane - Fr 20.05.11 10:55

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function MoveDir(const fromDir, toDir: string): Boolean;
var    
  fos: TSHFileOpStruct;    
begin    
  ZeroMemory(@fos, SizeOf(fos));
  with fos do    
  begin    
    wFunc  := FO_MOVE;    
    fFlags := FOF_FILESONLY;    
    pFrom  := PChar(fromDir + #0);    
    pTo    := PChar(toDir)    
  end;    
  Result := (0 = ShFileOperation(fos));    
end;



Trotzdem Danke :D genau was ich gesucht habe :D


Gerd Kayser - Fr 20.05.11 13:12

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
    pFrom  := PChar(fromDir + #0);    
    pTo    := PChar(toDir)
pFrom und pTo müssen mit einer Doppel-Null abgeschlossen werden!!!