Entwickler-Ecke
Windows API - Hilfe bei WinAPI-Funktionen
delphin2005 - Mi 27.07.05 09:50
Titel: Hilfe bei WinAPI-Funktionen
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:
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:
| 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 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 - Mi 27.07.05 12:21
Hallo und :welcome: im Delphi-Forum.
Ich glaube folgender Code, sollte das machen, was du möchtest:
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;
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:='';
ForceDirectories(Zielordner);
if FindFirst(QuellOrdner+'\*.*',faAnyFile,SR)=0 then repeat if (SR.Attr and faDirectory)=0 then begin Dec(Max); Dateien:=Dateien+QuellOrdner+'\'+SR.Name+#0; end; until (FindNext(SR)<>0) or (Max=0); FindClose(SR);
MoveFileEx(Dateien, Zielordner+'\'); end;
procedure TForm1.ButtonClick(Sender: TObject); begin DateienVerschieben('Z:\Alt','Z:\Neu',50); end; |
delphin2005 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
delphin2005 - 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
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 - 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:
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:
| 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:='';
RestLoeschen:=not DirectoryExists(Zielordner); if RestLoeschen then ForceDirectories(Zielordner); if FindFirst(QuellOrdner+'\*.pro',faAnyFile,SR)=0 then repeat if (SR.Attr and faDirectory)=0 then begin Dec(Max); Dateien:=Dateien+QuellOrdner+'\'+SR.Name+#0; end; until (FindNext(SR)<>0) or (Max=0); FindClose(SR); MoveFileEx(Dateien, Zielordner+'\');
if RestLoeschen then begin ShowMessage('Lösche '+QuellOrdner+'\*.pro'); end; end; procedure TForm1.ButtonClick(Sender: TObject); begin DateienVerschieben('d:\Daten','d:\Daten_import',50); end; |
Änderungen sind hervorgehoben.
Gruß,
maxk
delphin2005 - 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.
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 - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!