Autor Beitrag
delphin2005
Hält's aus hier
Beiträge: 3

WinXP Pro, Suse Linux 9.3
D2005 Pro, D5 Pro
BeitragVerfasst: Mi 27.07.05 09:50 
Hallo Forumsteilnehmer, bin neu hier.

Beschäftige mich mit Delphi erst seit paar Wochen. (sprich: Anfänger)

Hier mein Problem: will über ShellAPI Dateien mit bestimmten Dateiendungen verschieben. Es sollen z B. jede halbe Stunde
immer im Quellordner alle Daten größer 50 in ein Zielordner verschoben werden, 50 sollen bleiben. Ist jedoch der Zielordner nicht vorhanden, soll Überschuss an Daten (> 50) im Zielordner gelöscht werden. Ich weiß nicht wie und wo ich die nötige Schleife in meinem Code einbauen muss. Für Erfahrene unter euch ist es wohl ein Witz und eine Sache von paar Minuten. Bitte um Hilfe. :roll:

ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
{Funktion zum Verschieben}
function MoveFileEx(const ASource, ADest: String;
  ARenameCheck: boolean = true): boolean;

var
  sh: TSHFileOpStruct;
  // Schleife einbauen > 50 ???
begin

  sh.Wnd := Application.Handle;
  sh.wFunc := FO_MOVE;

  sh.pFrom := PChar(ASource + #0);
  sh.pTo := PChar(ADest + #0);
  sh.fFlags := FOF_MultiDestFiles;
  sh.fFlags := FOF_NOCONFIRMATION;
  if ARenameCheck then
    sh.fFlags := sh.fFlags;
  Result:=ShFileOperation(sh)=0;
end;

{Löschfunktion}
function DeleteFile(const fromDir: string): Boolean;
var
  fos: TSHFileOpStruct;     
begin     
  ZeroMemory(@fos, SizeOf(fos));
  with fos do     
  begin     
    wFunc  := FO_DELETE;
    fFlags := FOF_FILESONLY;
    fFlags := FOF_NOCONFIRMATION;
    pFrom  := PChar(fromDir + #0);
  end;
  Result := (0 = ShFileOperation(fos));     
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MoveFileEx('C:\daten\*.pro','D:\daten_import');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DeleteFile('C:\daten\*.pro');
end;


Gruß
Andreas
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mi 27.07.05 12:21 
Hallo und :welcome: im Delphi-Forum.
Ich glaube folgender Code, sollte das machen, was du möchtest:
ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
uses ShellApi;

{Funktion zum Verschieben}
function MoveFileEx(const ASource, ADest: String;
  ARenameCheck: boolean = true): boolean;
var
  sh: TSHFileOpStruct;
begin
  sh.Wnd := Application.Handle;
  sh.wFunc := FO_MOVE;

  sh.pFrom := PChar(ASource + #0);
  sh.pTo := PChar(ADest + #0);
  sh.fFlags := FOF_MultiDestFiles;
  sh.fFlags := FOF_NOCONFIRMATION;
  if ARenameCheck then
    sh.fFlags := sh.fFlags;
  Result:=ShFileOperation(sh)=0;
end;

procedure DateienVerschieben(const QuellOrdner, Zielordner:string; Max:integer);
var SR:TSearchRec;
    Dateien:string;
begin
 Dateien:='';

 // Zielverzeichnis erstellen
 ForceDirectories(Zielordner);

 // Erste Datei finden
 if FindFirst(QuellOrdner+'\*.*',faAnyFile,SR)=0 then repeat
  // Verzeichnisse wollen wir nicht
  if (SR.Attr and faDirectory)=0 then begin
   // Datei gefunden, Max senken
   Dec(Max);
   // Datei merken
   Dateien:=Dateien+QuellOrdner+'\'+SR.Name+#0;
  end;
 until (FindNext(SR)<>0or (Max=0);
 FindClose(SR);

 // Falls Dateien gemerkt, verschieben
 MoveFileEx(Dateien, Zielordner+'\');
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
 DateienVerschieben('Z:\Alt','Z:\Neu',50);
end;


user profile icondelphin2005 hat folgendes geschrieben:
Ist jedoch der Zielordner nicht vorhanden, soll Überschuss an Daten (> 50) im Zielordner gelöscht werden.
Was meinst du damit, willst du die Dateien im Quellverzeichnis löschen, die nicht übertragen wurden? Erklär das bitte nochmal etwas genauer!

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
delphin2005 Threadstarter
Hält's aus hier
Beiträge: 3

WinXP Pro, Suse Linux 9.3
D2005 Pro, D5 Pro
BeitragVerfasst: Mi 27.07.05 15:10 
Danke für deine Antwort, maxk

Kleiner Fehler bei der Formulierung ist mir unterlaufen. Es soll so laufen:
Wenn kein Zielordner vorhanden ist, dann soll der Überschuss an Daten (>50)
im Quellordner gelöscht werden. (Normaleweise wären die ja verschoben).

Ich habe dein Code bei mir eingebaut und getestet. Bei Compilierung keine Fehler.
Beim Ausführen über Button diese Fehlermeldung. "Fehler beim Verschieben der Datei.. -Kann die Datei nicht verschieben: der Dateiname ist ungültig oder zu lang ..".
Ich habe die Funktion so aufgerufen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  DateienVerschieben('c:\daten\*.pro','d:\daten_import',50);
end;


Die Ordner sind bei mir vorhanden, die Daten im Quellordner auch. :!:
Woran kann dieser Fehler liegen ?
Ist es möglich in meine Funktion zum Verschieben die entsprechenden Zeilen Code
einzubinden, damit z. B. 50 Dateien im Quellordner drin bleiben. :?:

Weitere Meinungen und Lösungen sehr erwünscht. :D

maxk, woran scheitert mein Aufruf der Funktion ?

Gruß,
Andreas
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mi 27.07.05 16:25 
Es scheitert wahrscheinlich daran, dass du mit *.pro eine Maske übergibst, wobei eigentlich ein Ordnername erwartet wird. Du kannst es aber ein wenig abwandeln:
ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
{Funktion zum Verschieben}  
function MoveFileEx(const ASource, ADest: String;  
  ARenameCheck: boolean = true): boolean;  
var  
  sh: TSHFileOpStruct;  
begin  
  sh.Wnd := Application.Handle;  
  sh.wFunc := FO_MOVE;  

 
  sh.pFrom := PChar(ASource + #0);  
  sh.pTo := PChar(ADest + #0);  
  sh.fFlags := FOF_MultiDestFiles;  
  sh.fFlags := FOF_NOCONFIRMATION;  
  if ARenameCheck then  
    sh.fFlags := sh.fFlags;  
  Result:=ShFileOperation(sh)=0;  
end;  

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

procedure DateienVerschieben(const QuellOrdner, Zielordner:string; Max:integer);  
var SR:TSearchRec;  
    Dateien:string
    RestLoeschen:boolean; 
begin  
 Dateien:='';  

 // Zielverzeichnis vorhanden?
 RestLoeschen:=not DirectoryExists(Zielordner);
 // Zielverzeichnis erstellen  
 if RestLoeschen then ForceDirectories(Zielordner);  
 
 // Erste Datei finden  
 if FindFirst(QuellOrdner+'\*.pro',faAnyFile,SR)=0 then repeat  
  // Verzeichnisse wollen wir nicht  
  if (SR.Attr and faDirectory)=0 then begin  
   // Datei gefunden, Max senken  
   Dec(Max);  
   // Datei merken  
   Dateien:=Dateien+QuellOrdner+'\'+SR.Name+#0;  
  end;  
 until (FindNext(SR)<>0or (Max=0);  
 FindClose(SR);  
 
 // Falls Dateien gemerkt, verschieben  
 MoveFileEx(Dateien, Zielordner+'\');  


 // Rest löschen?
 if RestLoeschen then begin
  ShowMessage('Lösche '+QuellOrdner+'\*.pro'); // <= Wenn OK, löschen
//  DeleteFile(QuellOrdner+'\*.pro'); // <= Sicherheitshalber erstmal auskommentiert
 end;

end;  
 
procedure TForm1.ButtonClick(Sender: TObject);  
begin  
 DateienVerschieben('d:\Daten','d:\Daten_import',50);  
end;
Änderungen sind hervorgehoben.

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
delphin2005 Threadstarter
Hält's aus hier
Beiträge: 3

WinXP Pro, Suse Linux 9.3
D2005 Pro, D5 Pro
BeitragVerfasst: Do 28.07.05 12:47 
Hallo zusammen und extra-gruss an maxk,
erstmal danke für den angepassten code.

Es scheint jedoch nicht so zu funktionieren wie es mir vorstelle.
Hier nochmal die Problematik.

1) Mit deinem Code wird die Datenmenge verschoben, die man vorher im Code angibt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.ButtonClick(Sender: TObject);  
begin  
 DateienVerschieben('d:\Daten','d:\Daten_import',50);  
end;


Es sollte aber die überschussige Datenmenge mit bestimmter Dateiendung (z.B. *.pro)
verschoben werden (z. B. 50 sollen bleiben, den Rest verschieben).

2) Wenn Zielordner nicht vorhanden, soll dieser "Rest" im Quellordner gelöscht werden.
Es soll auch kein Zielordner erstellt werden, falls nicht da.

3) Mögliche Fehlermeldungen soll am besten unterdrückt werden. Die Dateiendungen sollen
leicht veränderbar sein, was eigentlich schon ganz gut klappt.


Das ist im Wesentlichen mein Anliegen, hoffe ist nicht zu viel auf einmal.
Wie muss ich den Code nun für diese Problematik anpassen ?
Ehrlich gesagt, sehe ich mich da etwas überfordert mit meinen Delphi-Kentnissen. :?

Gruß

Andreas
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 28.07.05 13:10 
Ist auch nicht viel schwieriger. Ich versuch's aus aktuellem Anlass mal ohne Code ;) Während der Suche wird die Variable Max runtergezählt, wenn sie bei 0 angekommen ist, wird abgebrochen. Davor wird verschoben, wenn du es also genau andersrum machen willst, darfst du solange nichts machen, bis Max nichtmehr größer als 0 ist. Die Abbruchbedingung mittels Max entfällt dann. Das Erstellen des Verzeichnisses zu unterdrücken sollte auch nicht das Problem sein ;) Damit lässt sich alles bis auf Punkt 2 realisieren, den du auch mit Hilfe der Variable Max lösen kannst.

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.