Autor |
Beitrag |
Maisinator
      
Beiträge: 167
Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
|
Verfasst: Mo 19.10.09 11:37
hallo,
ich möchte eine art datenbank programm programmieren, welches den inhalt von ausgewählten ordnern auflistet. dabei sollen infos wie z.b. größe, hersteller, erstellungsdatum usw. angezeigt werden. nun möchte ich die aber nicht für jedes programm einzeln eintragen, wenn eine datei hinzu kommt. vielmehr soll das programm beim programmstart überprüfen, ob neue dateien vorhanden sind und diese infos dann von den dateien "hohlen". wie mach ich das am besten?
THX Moderiert von Narses: Topic aus VCL (Visual Component Library) verschoben am So 25.10.2009 um 14:32
_________________ Das Unmögliche wagen, um das Mögliche möglich zu machen...
|
|
blaskito
      
Beiträge: 63
Win2003, 2008, 2012, WinXP, Win7
Delphi 6 Pers.
|
Verfasst: Sa 24.10.09 20:51
Hi,
ich habe für ein simples Backup-Prog so etwas in dieser Art gebastelt:
-> findfirst .. <Ergebnis> .. findnext .. findclose zum (rekursiven) Durchforsten der Ordner
-> das Ergebnis jeweils mit einem Trennzeichen versehen, ergänzende Infos dazu, das ganze in eine Stringlist geschrieben und als TXT gespeichert
-> um die Performance zu verbessern kann man prüfen, ob die gefundene Datei schon in der beim letzten Lauf gespeicherten TXT drin ist und nur bei neuen Dateien die Infos holen
-> zum guten Schluss das Prog noch in den Autostart rein
Schöne Grüße aus dem Norden
blaskito
|
|
Maisinator 
      
Beiträge: 167
Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
|
Verfasst: So 25.10.09 21:28
Danke, dass mit findfirst findnext hatte ich auch schon herausgefunden. Vielmehr frage ich mich, wie kann ich die Infos (siehe Threatfrage) aus den Dateien auslesen?
_________________ Das Unmögliche wagen, um das Mögliche möglich zu machen...
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: So 25.10.09 23:34
Das Zaubersuchwörter heissen TWin32FindData und TSearchRec. Damit lässt sich zb. die Erstellungszeit auf dem Datenträger anzeigen.
Du brauchst dann nur noch mit dem Datum der letzten Suche (was du natürlich in der Registry) gespeichert hast) vergleichen und weisst welche Datei dem Verzeichnis hinzugefügt wurde. Mit GetFileVersionInfo lassen sich dann die Dateiinfos auslesen.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 26.10.09 07:23
Wenn es ein lokales Verzeichnis ist, kann man die Überwachung viel einfacher mit FindFirstChangeNotification, FindNextChangeNotification und ReadDirectoryChanges machen. Denn dann muss man die neue Liste nicht immer mit der alten vergleichen, sondern bekommt die Änderung auf dem Silbertablett.
msdn.microsoft.com/e...ibrary/aa364417.aspx
Das ganze in einen Thread gelegt und schon hat man eine Überwachung im Hintergrund.
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Mo 26.10.09 09:41
Der TE wollte bei Programmstart auf Änderungen überprüfen, aber sonst hast du natürlich Recht Sebastian.
|
|
Maisinator 
      
Beiträge: 167
Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
|
Verfasst: Mo 26.10.09 18:56
_________________ Das Unmögliche wagen, um das Mögliche möglich zu machen...
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Mo 26.10.09 19:56
In meiner Delphi Hilfe gibts ein super Beispiel, bei dir sicher auch - aber ich kopier das mal trotzdem 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 TForm1.Button1Click(Sender: TObject); const InfoNum = 10; InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments'); var S: string; n, Len, i: DWORD; Buf: PChar; Value: PChar; begin S := Application.ExeName; n := GetFileVersionInfoSize(PChar(S), n); if n > 0 then begin Buf := AllocMem(n); Memo1.Lines.Add('VersionInfoSize = ' + IntToStr(n)); GetFileVersionInfo(PChar(S), 0, n, Buf); for i := 1 to InfoNum do if VerQueryValue(Buf, PChar('StringFileInfo\040904E4\' + InfoStr[i]), Pointer(Value), Len) then Memo1.Lines.Add(InfoStr[i] + ' = ' + Value); FreeMem(Buf, n); end else Memo1.Lines.Add('No version information found'); end; | Du wirst bei der Suche hier im Forum sicher noch mehr finden
|
|
Maisinator 
      
Beiträge: 167
Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
|
Verfasst: Mo 26.10.09 20:06
Danke, aber iwie bekomm ich immernoch 0.
Hab die Prozedur mal ein bisschen abgekürzt um erstmal nur die größe auszulesen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var size: DWord; s: string; begin s:= Application.ExeName; size:= GetFileVersionInfoSize(PChar(s), size); Memo1.Lines.Add(IntToStr(size)); end; |
Was mach ich falsch????
--- Moderiert von Narses: Beiträge zusammengefasst---
Hab's jetzt hinbekommen. Warum geht das nur mit *.exe-dateien? Und wieso wird mir eine andere größe angezeigt, als die Datei eigentlich groß ist??? (1,52MB laut Windows/ laut Prog: 1452)
_________________ Das Unmögliche wagen, um das Mögliche möglich zu machen...
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 27.10.09 01:38
Das ist die Größe der Versionsinformationen, nicht der Datei...
Siehe Dokumentation...
msdn.microsoft.com/e...ibrary/ms647005.aspx
|
|
Vamos
      
Beiträge: 44
|
Verfasst: Di 27.10.09 12:02
Sitze gerade an einem ähnlichen Problem...
ich lese von 7 (Klingt komisch, soll aber so sein) Dateipfaden ALLE Dateien mit Findfirst aus, und lasse sie vorerst in 7 Listboxes eintragen. Nun möchte ich allerdings NUR die Files finden, die mindestens X Tage alt sind. Alle anderen Files interessieren nicht...
Mein 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:
| procedure GetFilesInDirectory(Directory: string; const Mask: string; List: TStrings; WithSubDirs, ClearList: Boolean);
procedure ScanDir(const Directory: string); var SR: TSearchRec; begin if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try repeat List.Add(Directory + SR.Name) until FindNext(SR) <> 0; finally FindClose(SR); end;
if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); until FindNext(SR) <> 0; finally FindClose(SR); end; end; end;
begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; ScanDir(Directory); finally List.EndUpdate; end; end; |
Leider weiss ich nicht genau, wo und wie ich das in meinen Quelltext einbinden muss... Folgende Interessante Seite habe ich noch gefunden:
www.delphi-treff.de/...Dateien%20ermitteln/
Über Hilfe würde ich mich sehr freuen, thx @ all
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Di 27.10.09 15:45
Wo: Schau mal wo etwas in die Liste geschrieben wird
Delphi-Quelltext 1: 2: 3: 4:
| if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try repeat List.Add(Directory + SR.Name); until FindNext(SR) <> 0; |
[edit] Schmarrn gelöscht
Zuletzt bearbeitet von Hobby-Programmierer am Di 27.10.09 17:37, insgesamt 1-mal bearbeitet
|
|
Maisinator 
      
Beiträge: 167
Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
|
Verfasst: Di 27.10.09 15:49
Und wie bekomme ich die größe der Datei ausgelesen?
_________________ Das Unmögliche wagen, um das Mögliche möglich zu machen...
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 27.10.09 16:17
Hallo,
Dir ist doch bestimmt schon in den Codes das aufgefallen:
Delphi-Quelltext
Und hier mal die Struktur des Records:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TSearchRec = record Time: Integer; Size: Integer; Attr: Integer; Name: TFileName; ExcludeAttr: Integer; FindHandle: THandle; FindData: TWin32FindData; end; |
fällt Dir was auf 
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 27.10.09 16:53
die ersten 4 Variablen haben die selbe länge??
Sorry, musste einfach sein. xD
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Vamos
      
Beiträge: 44
|
Verfasst: Di 27.10.09 18:04
Hobby-Programmierer hat folgendes geschrieben : | Wo: Schau mal wo etwas in die Liste geschrieben wird
Delphi-Quelltext 1: 2: 3: 4:
| if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try repeat List.Add(Directory + SR.Name); until FindNext(SR) <> 0; |
[edit] Schmarrn gelöscht |
Danke für die Antwort, jetzt steh ich ganz aufm Schlauch... : (
Scheint zu funktionieren, nur funktioniert nicht : )
Habe mal eine Datei heute (Datum geprüft) erstellt und ihn nach " = date" suchen lassen. Das Datum hole ich mir aus einem label. Nur er findet nichts...O.o
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:
| procedure ScanDir(const Directory: string); var SR: TSearchRec; a: TDateTime; Lnewdate: TLabel; begin Lnewdate.caption := DateToStr(a);
if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try repeat begin if GetCreationTimeOfFile(Directory + SR.Name) = a then List.Add(Directory + SR.Name) end; until FindNext(SR) <> 0; finally FindClose(SR); end;
if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); until FindNext(SR) <> 0; finally FindClose(SR); end; end; end;
begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; ScanDir(Directory); finally List.EndUpdate; end; end; |
Weiss jemand rat? Danke im Voraus
--- Moderiert von Narses: Beiträge zusammengefasst---
[edit] Oh, du hast das rausgenommen, denke mal du hast es gestestet und auch falsche Ergbenisse bekommen :-S[/quote]
Ps: wenn ich statt dem a - aktuelles Datum date einsetze bekomme ich wieder nichts, also daran kann es nicht liegen : (
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Di 27.10.09 21:35
|
|
Maisinator 
      
Beiträge: 167
Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
|
Verfasst: Mi 28.10.09 16:32
_________________ Das Unmögliche wagen, um das Mögliche möglich zu machen...
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mi 28.10.09 16:40
Delphi-Hilfe hat folgendes geschrieben: |
TSearchRec definiert die Dateiinformationen für die Suche mit den Funktionen FindFirst und FindNext. Wird eine Datei gefunden, werden die Felder des TSearchRec-Parameters modifiziert, um die gefundene Datei zu bestimmen.
Attr gibt die Dateiattribute der Datei an. Mit den folgenden Attributkonstanten kann getestet werden, welche Attribute für eine Datei gesetzt sind.
Anmerkung: In Windows werden die Attributkonstanten direkt den DOS-Dateiattribute umgewandelt.
Anmerkung: In Linux verweisen die Attributkonstanten auf eine Reihe von Dateicharakteristika. Im Feld Mode sind die speziellen Berechtigungsmodi enthalten.
ConstantValueDescriptionLinux Bedeutung
Konstante Wert Beschreibung Linux Bedeutung
faReadOnly 1 Schreibgeschützte Datei Der aktuelle Benutzer hat keinen Schreibberechtigung.
faHidden 2 Verborgene Datei Der Dateiname beginnt mit ".".
faSysFile 4 Systemdatei Die Datei ist ein Socket, eine symbolische Verknüpfung, eine Gerätedatei oder FIFO.
faVolumeID 8 Laufwerks-ID Wird nicht verwendet.
faDirectory 16 Verzeichnis Verzeichnis
faArchive 32 Archivdatei Wird nicht verwendet.
faSymLink 64 Symbolische Verknüpfung Die Datei ist eine symbolische Verknüpfung.
faAnyFile 71 Beliebige Datei Beliebige Datei
Die Konstante faReadOnly hat denselben Namen wie der im Typ TFieldAttribute definierte Aufzählungswert. Wenn sowohl die Unit SysUtils und als auch die Unit Db in die Quelldatei einbezogen sind, müssen Sie Zweideutigkeiten vermeiden, indem Sie die jeweilige Unit angeben, z.B. SysUtils.faReadOnly (Delphi) oder SysUtils::faReadOnly (C++).
Um ein Attribut zu testen, führen Sie eine AND-Verknüpfung des Attr-Feldes mit der Attributkonstante durch. Besitzt die Datei das betreffende Attribut, ist der zurückgegebene Wert größer als 0. Wurde beispielsweise eine verborgene Datei gesucht, ergibt der folgende Ausdruck true:
(SearchRec.Attr and faHidden) <> 0.
(SearchRec.Attr & faHidden) != 0.
Time enthält den Zeitstempel der Datei. Mit FileDateToDateTime kann dieser Wert in einen TDateTime-Wert konvertiert werden.
Size enthält die Größe in Byte.
Name enthält den Basisdateinamen sowie die Namenserweiterung.
FindHandle enthält ein internes Handle, mit dem der Status des Suchvorgangs protokolliert wird.
FindData (nur Windows) enthält zusätzliche Informationen wie Erstellungszeit, Zeit des letzten Zugriffs und den langen sowie kurzen Dateinamen.
|
|
|
Maisinator 
      
Beiträge: 167
Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
|
Verfasst: Mi 28.10.09 16:42
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Mist! Schon wieder gepennt... 
_________________ Das Unmögliche wagen, um das Mögliche möglich zu machen...
|
|
|