Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 14.11.04 19:18 
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):
ausblenden 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):
ausblenden 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):
ausblenden 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.

Für diesen Beitrag haben gedankt: Jakane
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:

_________________
We are, we were and will not be.
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Fr 20.05.11 10:55 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 20.05.11 13:12 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:

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