| Autor |
Beitrag |
JustusJonas
      
Beiträge: 222
|
Verfasst: Di 14.12.04 11:22
Hallo Leute,
hat jemand für mich ein wenig Quelltext oder zumindest einen Tipp?
Ich hab ein kleines Programm gemacht, das das aktuelle Verzeichnis nach Dateien durchsucht und diese in ein Zielverzeichnis verschiebt, falls verschiedene Kriterien zutreffen.
Bisher sieht das ganze so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| if FindFirst (QuellPfad + FileMask, 0, sr) = 0 then begin
if edtSize.Text = '' then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end; end;
while FindNext(sr) = 0 do begin if edtSize.Text = '' then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end; end; |
Jetzt würde ich gerhe noch irgendwie einbauen, dass in den Unterverzeichnissen auch gesucht werden soll. Wie kann ich das machen? Habe hier schon einiges gefunden und auch in der Delphi-Hilfe. Es hat sicher was mit den Attr. zu tun, die faDirectory lauten müssen, aber ich komm einfach nicht drauf ich das programmiertechnisch umsetzen.
Kann mir jemand helfen?
Greetz
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Di 14.12.04 11:31
Einfach nach faDirectory suchen und dann rekursiv in dem dann wieder nach Dateien.
AXMD
|
|
JustusJonas 
      
Beiträge: 222
|
Verfasst: Di 14.12.04 11:38
So weit war ich schon...mir fehlt nur der Quelltext wie ich den einbauen könnte!
Greetz
|
|
Grendel
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: Di 14.12.04 11:43
| JustusJonas hat folgendes geschrieben: | | So weit war ich schon...mir fehlt nur der Quelltext wie ich den einbauen könnte! |
Dann frag doch nicht, ob Dir jemand helfen könnte sondern direkt, ob Dir jemand den Quellcode schreibt.
Bis neulich ...
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Di 14.12.04 11:56
Pseudo Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure DateienInAngegebenenOrdnerSuchen(Ordner, ...) begin while OrdnerNochNichtFertigDurchsucht do begin NächstenEintragBegutachten; if Eintrag = EinOrdner then DateienInAngegebenenOrdenerSuchen(Eintrag, ...) else AndereArbeitenMitEintragDurchführen; ... end; end; |
Ist rekursiv, bestimmt nicht vollständig und jetzt nur so vom Prinzip!
Wie du auf das Attribut faDirectory testen kannst, steht in der Hilfe unter TSearchRec().
|
|
JustusJonas 
      
Beiträge: 222
|
Verfasst: Di 14.12.04 12:11
So findet er aber nichts bzw. gibt mir keine Ausgabe!
Delphi-Quelltext 1: 2:
| if FindFirst(QuellPfad, 0, sr) = 0 then if (sr.Attr AND faDirectory > 0) then ShowMessage('Verzeichnis: ' + sr.Name) |
Greetz
|
|
Grendel
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: Di 14.12.04 12:21
Setz den zweiten Parameter des FindFirst() mal auf "faAnyFile"
Bis neulich ...
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Di 14.12.04 13:32
| Grendel hat folgendes geschrieben: | Setz den zweiten Parameter des FindFirst() mal auf "faAnyFile"
|
Noch besser: Lies dir in der Hilfe bei FindFirst die Sache mit den Attributen durch und entscheide dann selbst.
|
|
Grendel
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: Di 14.12.04 13:39
| IngoD7 hat folgendes geschrieben: | | Lies dir in der Hilfe bei FindFirst die Sache mit den Attributen durch... |
Sach ma, wie kannst Du so unverschämt sein und verlangen, daß jemand selber in die Hilfe gucken soll.
Du könntest es ihm ja mindestens mal abschreiben und die relevanten Textstellen markieren.
Bis neulich ...
|
|
JustusJonas 
      
Beiträge: 222
|
Verfasst: Di 14.12.04 13:50
| Grendel hat folgendes geschrieben: | | IngoD7 hat folgendes geschrieben: | | Lies dir in der Hilfe bei FindFirst die Sache mit den Attributen durch... |
Sach ma, wie kannst Du so unverschämt sein und verlangen, daß jemand selber in die Hilfe gucken soll.
Du könntest es ihm ja mindestens mal abschreiben und die relevanten Textstellen markieren.
Bis neulich ... |
Hallo mein Freund,
ich will dir mal kurz ein paar Worte erklären:
Wenn ich hier poste, dann ist das für mich persönlich mein letzter Ausweg, da ich mit der Hilfe oder bereits gefundenen Beiträgen nicht klarkomme. Wenn dann so ein Typ wie du schreibst ich könnte ja selbst nachgucken fühle ich mich schon ein wenig persönlich angegriffen, da du keine Ahnung hast was ich schon alles versucht habe!!
Also lass mich einfach mit deinen unnötigen Kommentaren in Ruhe, wenn du keine konstruktive Hilfe bieten kannst!
btw: Mit faAnyFile funktionierts auch nicht!
Greetz
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Di 14.12.04 13:58
Hallo? wer hat dich hier angegriffen? also komm mal runter
| IngoD7 hat folgendes geschrieben: | | Noch besser: Lies dir in der Hilfe bei FindFirst die Sache mit den Attributen durch und entscheide dann selbst. |
Ist wohl als ernstgemeinter Tipp anzusehen und nicht als Angriff. Und es gitb hier genug leute, die nicht wissen wie man die OH bedient und denen muss man dann eben sagen, dass es sowas gitb un dass sie da mal nachschauen sollen! IngoD7 wollte dich sicherlich nicht angreifen.
| Grendel hat folgendes geschrieben: | | IngoD7 hat folgendes geschrieben: | | Lies dir in der Hilfe bei FindFirst die Sache mit den Attributen durch... |
Sach ma, wie kannst Du so unverschämt sein und verlangen, daß jemand selber in die Hilfe gucken soll.
Du könntest es ihm ja mindestens mal abschreiben und die relevanten Textstellen markieren.
Bis neulich ... |
Und das ist wohl eher ironisch gemeint als ernst (-> Smiley). Das spielt eher auf die o.g. leute an, die die OH nicht kennen.
Also ganz cool
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Grendel
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: Di 14.12.04 14:08
| JustusJonas hat folgendes geschrieben: | | Hallo mein Freund, |
Auch Dir mein Freund ein zünftiges Hallo
| JustusJonas hat folgendes geschrieben: | ich will dir mal kurz ein paar Worte erklären:
Wenn ich hier poste, dann ist das für mich persönlich mein letzter Ausweg, da ich mit der Hilfe oder bereits gefundenen Beiträgen nicht klarkomme. |
Aha. Und warum schreibst Du dann nicht konkret welcher Punkt der Hilfe Dir Verständnissprobleme bereitet?! Dann kann man auch über diesen konkreten Punkt reden bzw. zum Verständniss beitragen. Aber zu sagen, die Hilfe hilft nicht bitte liefert mir Lösungen finde ich irgendetwas zwischen lächerlich und unverschämt.
| JustusJonas hat folgendes geschrieben: | | Wenn dann so ein Typ wie du schreibst ich könnte ja selbst nachgucken fühle ich mich schon ein wenig persönlich angegriffen, da du keine Ahnung hast was ich schon alles versucht habe!! |
Stimmt und Du hast Dir auch keine Mühe gemacht hier zu beschreiben, was Du alles schon versucht hast und woran es konkret scheitert. Hättest Du das nämlich getan hätte ich garantiert nicht den Eindruck gewonnen, daß hier jemand für sich denken lassen möchte.
Vielleicht tue ich Dir mit dieser Einschätzung Unrecht aber Deine Posts haben bei mir diesen Eindruck erweckt.
| JustusJonas hat folgendes geschrieben: | | Also lass mich einfach mit deinen unnötigen Kommentaren in Ruhe, wenn du keine konstruktive Hilfe bieten kannst! |
Hilfe bieten könnte ich schon aber ich wenn ich das Gefühl habe, daß der Fragende nicht mitdenken will helfe ich grundsätzlich nicht.
| JustusJonas hat folgendes geschrieben: | | btw: Mit faAnyFile funktionierts auch nicht! |
Dazu sage ich jetzt lieber nix mehr.
Bis neulich ...
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Di 14.12.04 14:19
Ich gehe nicht davon aus, dass JustusJonas mich meinte. Ist aber auch wurscht.
Meinen Hinweis mit der OH unter FindFirst erhalte ich aufrecht. Dabei ist unerheblich, wie oft das schon gelesen (und meinetwegen nicht verstanden) wurde.
Anfangs stand im Code für das Attribut eine 0. Damit werden garantiert schonmal keine Ordner gesucht und gefunden. Ob das mit faAnyFile geht oder gehen müsste, weiß ich persönlich jetzt nicht. Aber nach Lesen der Hilfe käme zumindest ich auf die Idee, es direkt mit faDirectory zu versuchen.
Wenn das dann auch nicht geht, liegt es irgendwo am Programm. Kann man sich ja drüber unterhalten. Haben wir ja bisher noch wenig von gesehen.
Der Forderung von Grendel nach konkreten Fragen stimme ich im übrigen zu. Ein "geht auch nicht" bringt weder den Fragesteller, noch die Antwortgeber weiter.
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Di 14.12.04 14:31
Und nochwas (jaja, zweites Posting hintereinander  , aber der Tipp soll nicht in dem anderen Roman untergehen  ):
Der Pfad - also bei dir im Code QuellPfad - ist auch gleichzeitig die Dateinamens maske. Wenn da was falsches drin steht, findest du es alleine deswegen schon nicht (also ganz unabhängig von den Attributen).
Steht auch in der Hilfe an selber Stelle (habe ich eben auch erst nachgelesen).
|
|
JustusJonas 
      
Beiträge: 222
|
Verfasst: Di 14.12.04 14:45
Hi Leute,
sorry, wollte hier keine Unruhe stiften!
Bin nur ein wenig in Rage gekommen, als ich diesen Post gelesen habe.
Irgendwie versagen meine Programmierkenntnisse und dazu auch noch meine komplette Logik, komme irgendwie nicht mehr mit bei der ganzen Sache. Vielleicht bin ich deshalb ein wenig aufgebracht. Ich entschuldige hiermit auf jeden Fall bei euch! War überreagiert von mir und eigentlich sollte ich ja echt froh sein, dass ihr mir überhaupt helft.
Wie gesagt, aus der Hilfe werde ich einfach nicht mehr schlau, dir sagt mir nix Neues mehr, obwohl ich mir sicher bin, dass ich sie richtig bediene. Wie gesagt, hier scheitert es schon bei meiner Logik.
Was mache ich, wenn ich ein Directory gefunden habe? Dann muss ich ja diesen kompletten Inhalt noch mal durchsuchen...und wenn da noch eines drin ist!? Da tu ich mir echt ein wenig schwer. Ich weiß, das Zauberwort ist Rekursiv, aber bei sowas dreht sich alles in meinem Kopf!
Delphi-Quelltext 1: 2:
| if FindFirst('C:\', faAnyFile, sr) = 0 then if (sr.Attr AND faDirectory > 0) then ShowMessage('Verzeichnis: ' + sr.Name) |
Also mit diesem Code hier findet er überhaupt nichts und eine ShowMessage bleibt aus!
Ich poste euch mal meinen kompletten Programmcode, wie er im Moment ist, ok? Und ich will einfach nur, dass er nicht nur das aktuelle Verzeichnis durchsucht sondern auch alle Unterverzeichnisse!
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: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165:
| procedure TfrmCinderella.btnDoClick(Sender: TObject); var FileMask, QuellPfad, ZielPfad, Vergleich : String; Size, Size2 : Integer; begin if edtExt.Text = '' then FileMask := '*.*' else FileMask := '*.' + edtExt.Text;
QuellPfad := edtQuelle.Text; if edtZiel.Text = 'C:\' then ZielPfad := 'C:\'; ZielPfad := edtZiel.Text;
if edtSize.Text <> '' then Size := StrToInt(edtSize.Text)*1024;
if edtSize2.Text <> '' then Size2 := StrToInt(edtSize2.Text)*1024;
if edtSize2.Text = '' then edtSize2.Text := '0';
if cbSize.Text <> '' then Vergleich := edtSize.Text;
if FindFirst (QuellPfad + FileMask, 0, sr) = 0 then begin btnDo.Enabled := False;
if (FileGetAttr(sr.Name) and faReadOnly) > 0 then FileSetAttr(sr.Name, FileGetAttr(sr.Name) xor faReadOnly);
if edtSize.Text = '' then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 0 then if sr.Size < Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 1 then if sr.Size > Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 2 then if sr.Size = Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 3 then if sr.Size <> Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 4 then if sr.Size <= Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 5 then if sr.Size >= Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end; end;
while FindNext(sr) = 0 do begin
if (FileGetAttr(sr.Name) and faReadOnly) > 0 then FileSetAttr(sr.Name, FileGetAttr(sr.Name) xor faReadOnly);
if edtSize.Text = '' then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 0 then if sr.Size < Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 1 then if sr.Size > Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 2 then if sr.Size = Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 3 then if sr.Size <> Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 4 then if sr.Size <= Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 5 then if sr.Size >= Size then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end;
if cbSize.ItemIndex = 6 then if (sr.Size > Size2) and ( sr.Size < Size) then begin CopyFile(PChar(QuellPfad + sr.Name), PChar(ZielPfad + sr.Name), False); DeleteFile(QuellPfad + sr.Name); mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Datei ' + sr.Name + ' wurde verschoben'); end; end;
mmLog.Lines.Add(GetDatum + ' - ' + GetTime + ': Vorgang beendet'); mmLog.Lines.Add('-----------------------------------------------------------------'); btnDo.Enabled := True; end; |
Hoffe ihr könnt damit mehr anfangen, sorry noch mal!
Greetz
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Di 14.12.04 14:53
|
|
Marlem
Hält's aus hier
Beiträge: 6
D5 Prof.
|
Verfasst: Di 14.12.04 15:08
tach,
ich habe hier was:
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:
| procedure SearchDirectories(Startdirectory,mask: string;var erg : TStringList); var search: TSearchRec; directory: string; begin directory := Startdirectory; directory := DirectorySlash(directory); if FindFirst(directory + '*.*', faDirectory, search) = 0 then begin repeat if ((search.Attr and faDirectory) = faDirectory) and (search.Name[1] <> '.') then begin if search.name = mask then begin erg.Add(directory + search.Name); end; SearchDirectories(directory+search.Name ,mask,erg); end; until FindNext(search) <> 0; end; FindClose(search); end; |
|
|
JustusJonas 
      
Beiträge: 222
|
Verfasst: Mo 20.12.04 14:27
Hi Leute,
ich bin's schon wieder. Sorry, hatte keine Zeit mehr seit letzter Woche um reinzuschauen.
Ich raffe es aber trotzdem irgendwie noch nicht so richtig.
Kann mir keiner sagen, wie ich das in meine schon bestehende Funktion einbauen kann, dass er auch noch die Unterverzeichnisse mitnimmt. Wie gesagt, stehe da leider irgendwie aufm Schlauch!
Greetz
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 20.12.04 16:23
Also, so suche ich immer rekursiv nach Dateien
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.Suche(pfad:string); var sr : TSearchrec; begin if AnsiEndsStr('\', pfad) then pfad:=Copy(Pfad,1,length(pfad)-1); if findfirst(pfad+'\*',FaAnyfile,sr) = 0 then repeat if (sr.name<>'.') AND (sr.name<>'..') then begin end; until Findnext(sr)<>0; findclose(sr); if findfirst(pfad+'\*',FaDirectory,sr)=0 then repeat if (sr.name<>'.') AND (sr.name<>'..') then Suche(pfad+'\'+sr.name); until Findnext(sr)<>0; findclose(sr); end; |
Ich hoffe, das hilft etwas weiter.
_________________ We are, we were and will not be.
|
|
|