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, $FFFFFFFF, nil, 255); For Idx := 0 To FileCount -1 Do Begin Size := DragQueryFile (aMsg.WParam, Idx, nil, 0) + 1; Filename := StrAlloc (Size); If DragQueryFile (aMsg.WParam, Idx, Filename, Size) = 1 Then ; neuesAlbum:=TAlbum.Create; (neuesAlbum.OrdnerInfo as TOrdner).pfad:=pChar(Filename); 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 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.
We are, we were and will not be.