Autor |
Beitrag |
kradon
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 31.07.02 15:57
Hallo zusammen,
ich habe ein Problem und zwar habe ich ein Verzeichnis
c:\dateien\
darin stehen folgende Dateien
test1.txt, test2.txt, test3.txt und test4.doc
ich möchte nun alle Dateien mit der Endung .txt in das Verzeichnis
d:\archiv\
verschieben (Quelldatei soll nach dem verschieben nicht mehr vorhanden sein).
So und um das Chaos perfekt zu machen können beliebig viele Dateien
mit beliebig vielen Endungen in dem Verzeichnis c:\dateien\ stehen.
Vielen Dank im voraus.
Gruß
Karsten
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 31.07.02 17:10
Hallo,
die richtigen Dateien finden kannst du mit FindFirst, FindNext und FindClose. Verschieben kannst du mit der API funktion MoveFile.
Gruß
Klabautermann
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 31.07.02 17:22
So geht es auch ohne API. Ist allerdings (wahrscheinlich) etwas umständlicher, ich kenne die API-Funktion nicht. Meine Delphi-Hilfe weigert sich, sie zu finden! Frechheit!
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| VAR datei : tSearchRec; erfolg : Boolean; begin erfolg:=(FindFirst(quellverzeichnis+'\*.txt',faAnyFile,datei)=0); while erfolg do begin CopyFileTo(quellverzeichnis+'\'+datei.name,zielverzeichnis+'\'+datei.name); DeleteFile(quellverzeichnis+'\'+datei.name); erfolg := (FindNext(datei)=0); end; FindClose(datei); end; |
Wichtig: "CopyFileTo" steht in der Unit "IdGlobal"
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 31.07.02 17:45
Peter Lustig hat folgendes geschrieben: | Meine Delphi-Hilfe weigert sich, sie zu finden! Frechheit! |
Weil sie in der API-Hilfe beschrieben ist. gebe mal MoveFile ein und drücke F1 (nicht Hilfe aufrufen und dann MoveFile eingeben). Ebenfalls sehr interessant (in diesem zusammenhang) CopyFile und DeleteFile.
Zitat: | BOOL MoveFile(
LPCTSTR lpExistingFileName, // address of name of the existing file
LPCTSTR lpNewFileName // address of new name for the file
); |
Der aufruf sieht also so aus:
Quelltext 1: 2:
| IF MoveFile(pChar('C:\Autoexec.Bak'), pChar('C:\tmp\Autoexec.Bak')) THEN ShowMessage('Datei erfolgreich verschoben'); |
Das ganze ist übrigens auch in der Windows.Pas importiert, so das du in Formularunits nicht mal deine Uses-Klauses erweitern musst.
Gruß
Klabautermann
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 31.07.02 18:55
Hi!
Danke! So klappt das Anzeigen der Hilfe. Kannst Du mir sagen, wo ich eine Liste der API-Funktionen runterladen kann? (Oder wie ich die Informationen, die ja irgendwo auf meinem Rechner gespeichert sein müssen, auslesen kann?)
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 31.07.02 19:01
Hallo,
die Hife ist in deinem Startbutton eingetragen . Start->Programme->{Delphi}->Hilfe->Microsoft SDK.
Gruß
Klabautermann
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 31.07.02 19:12
Peinlich!
Danke,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
GPF
Beiträge: 85
|
Verfasst: Mi 31.07.02 19:55
Oder benutze doch gleich die Windows API Routinen zum Verschieben von Dateien:
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:
| function SHFileMove(Owner:Integer; FromFile, ToFile:string; Flags: word):boolean; function ConvertFile(FileName:string):PChar; var NewFile:string; begin NewFile:=Filename; while pos(';', NewFile)>0 do NewFile[pos(';', NewFile)]:=#0; NewFile:=NewFile+#0+#0; Result:=PChar(NewFile); end; const Aborted:boolean=true; var Struct: TSHFileOpStructA; begin with Struct do begin wnd:=Owner; wFunc:=FO_Move; PFrom:=ConvertFile(FromFile); pTo:=PChar(ToFile); fFlags:=Flags; fAnyOperationsAborted:=Aborted; hNameMappings:=nil; lpszProgressTitle:=nil; end; Result:=(SHFileOperationA(Struct)=0) and (not aborted); end; |
Ich habe die Funktion so angepaßt, daß sie genau Deinen Bedürfnissen gerecht wird. Da eine einzige Methode unter Windows sämtliche Dateioperationen durchführt (Kopieren, Verschieben, Löschen) sind die Parameter etwas schwierig zu handeln. Anstatt Wildcards zu nutzen kannst Du auch mehrere Dateien durch Semikolon getrennt als Quelle angeben. Windows arbeitet intern mit #0. Die Methode Convertfiles konvertiert alle ; in #0 und fügt an das Ende zweimal #0 an, damit Windows das Ende der Dateiliste erkennt.
Als Flagkomination empfehle ich Dir FOF_FILESONLY or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_SILENT. Genaueres dazu kannst Du in dem Windows SDK (nicht die Delphi Hilfe - wird aber mit Delphi ausgeliefert) unter dem Schlüsselwort SHFileOperation nachlesen.
Owner kannst Du auf 0 setzen, sofern Du nicht den Windows eigenen Verschieben/Kopieren/Löschen-Dialog angezeigt bekommen möchtest (Flag FOF_SILENT zeigt diesen Dialog nicht an). Nimm ansonsten das Fensterhandle.
Als Beispiel zum Verschieben aller Textdateien benutze folgenden Einzeiler:
Quelltext 1:
| SHFileMove(Handle, 'c:\Quellordner\*.txt', 'c:\Zielordner', FOF_FILESONLY or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_SILENT); |
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 31.07.02 20:19
Irgendwie glaube ich, dass die Methode von Klabautermann sehr viel einfacher ist. Wenn Du im Quelltext, den ich weiter oben geschrieben habe, "CopyFileTo" und "DeleteFile" durch die API-Funktion "MoveFile", wie von Klabautermann beschrieben, ersetzt, hast Du einen ziemlich kompakten und einfach verständlichen Code.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
GPF
Beiträge: 85
|
Verfasst: Mi 31.07.02 20:29
Das ist wahr. Allerdings sollen die alten aus dem 16 bit Windows stammenden Funktionen auf Dauer ersetzt werden. Laut den jetzigen Ankündigungen von MS könnte dies schon beim nächsten Windows der Fall sein.
Abgesehen davon bin ich mir nicht sicher ob MoveFile, CopyFile, DeleteFile korrekt mit Wildcards und Unterverzeichnissen korrekt klar kommt.
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 31.07.02 20:54
Zitat: |
Abgesehen davon bin ich mir nicht sicher ob MoveFile, CopyFile, DeleteFile korrekt mit Wildcards |
Mit Wildcards müssen diese Funktionen bei dem gegebenen Code nicht zusammen arbeiten. Ob sie das überhaupt können, weiß ich nicht, wäre aber interessant nachzuschauen/auszuprobieren.
Zitat: | und Unterverzeichnissen korrekt klar kommt. |
Was meinst Du damit?
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
GPF
Beiträge: 85
|
Verfasst: Mi 31.07.02 21:13
SHFileOperation akzeptiert auch Wildcards - damit wird Deine Dateiiterierungsroutine überflüssig.
Als Quell und Zielparameter akzeptiert diese Windows Routine auch Verzeichnisse. Es wäre ohne Probleme auch möglich zusätzlich einen Ordner zum Verschieben anzugeben. Der Code würde dann wie folgt aussehen:
Quelltext 1:
| SHFileMove(Handle, 'c:\Quellordner\*.txt;c:\Quellordner\MoveMeFolder', 'c:\Zielordner', FOF_FILESONLY or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_SILENT); |
Damit werden also einerseits alle Textdateien aus dem Ordner c:\Quellordner\ verschoben - andererseits aber auch der Ordner MoveMeFolder inklusive aller Unterordner und Dateien. Ich bin mir nicht sicher ob MoveFile dies ebenso korrekt macht.
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 31.07.02 23:46
Ja,
SHFileOperation ist um einiges mächtiger und Komplizierten. Was mich am mesten dran stört sind die Animationen. Lassen die sich unterdrücken?
Gruß
Klabautermann
|
|
GPF
Beiträge: 85
|
Verfasst: Do 01.08.02 04:47
Natürlich, wie ich bereits gesagt habe kann man durch das Flag FOF_SILENT die Animation unterdrücken.
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 01.08.02 09:25
GPF hat folgendes geschrieben: | Natürlich, wie ich bereits gesagt habe kann man durch das Flag FOF_SILENT die Animation unterdrücken. |
Peinlich, habe deine obriges Posting nur überflogen.
Ich schätze dann werde ich mir bei gelegenheit mal einfache Copy, move ... Befehle auf dieser Basis bauen.
Gruß
Klabautermann
|
|
kradon
Hält's aus hier
Beiträge: 11
|
Verfasst: Do 01.08.02 10:07
Titel: WOW
Also Leute,
erst mal vielen Dank für die ganzen Antworten, aber wenn ich mir hier euren Quellcode so anschaue komme ich mir ziemlich unwissend vor. *g*
Wäre nett wen jemand von euch einmal den Code mit ausführlichen Komentaren für Dummies versehen kann.
Gruß
Karsten
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 01.08.02 12:06
Hi!
Eigentlich bin ich inzwischen auch der Meinung, dass der Code von GPF der Bessere ist, aber leichter ist mein Code mit der Ergängzung von Klabautermann.
Wenn Du den Code haben möchtest, kann ich Dir den gerne noch mal mit Kommentaren geben. Aber wie gesagt, ich glaube der von GPF ist besser.
Problem: ich bekomme ihn nicht ans Laufen. Die Funktion "SHFileOperation" steht zwar in der API-Hilfe, wir von Delphi aber nicht akzeptiert.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Klabautermann
Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 01.08.02 13:35
Hallo,
@Peter Lustig: denke an das "uses ShellAPI"
@GPF: Ich habe mir das komando noch mal in der Hilfe angesehen. Dort fand ich die angabe, das dieser Befehl unter Windows NT nicht zur verfügung steht. Ich habe ihn vor einer Weile mal unter W2k erfolgreich eingestzt. Weist du ab welcher Version er auch auf der NT schiene läuft?
Gruß
Klabautermann
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 01.08.02 14:10
Zitat: |
@Peter Lustig: denke an das "uses ShellAPI"
|
Ups! Damit funktioniert es jetzt.
In meiner Hilfe steht übrigens zu dem Befehl die Bemerkung "Now Supported on Windows NT".
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
kradon
Hält's aus hier
Beiträge: 11
|
Verfasst: Do 01.08.02 15:20
Titel: Dummies
Hallo zusammen !!!
@Peter Lustig könntest du mir deinen Quellcode noch einmal per
Mail inklusive Kommentare zukommen lassen ? Sozusagen
zum selbststudium.
Bitte an: kradon@web.de
@GPF Würde mich freuen, wenn du das auch machen könntest
Mal eine Frage an alle, wie lange Programmiert ihr eigentlich schon und
mit welcher Version von Delphi ?
Ich für meinen teil habe vor 1 Jahr angefangen und programmiere
mit Delphi 3.
Gruß
Karsten
|
|