Autor Beitrag
Maisinator
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167

Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
BeitragVerfasst: 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 63

Win2003, 2008, 2012, WinXP, Win7
Delphi 6 Pers.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167

Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Mo 26.10.09 09:41 
Der TE wollte bei Programmstart auf Änderungen überprüfen, aber sonst hast du natürlich Recht Sebastian.
Maisinator Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167

Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
BeitragVerfasst: Mo 26.10.09 18:56 
user profile iconHobby-Programmierer hat folgendes geschrieben Zum zitierten Posting springen:
Mit GetFileVersionInfo lassen sich dann die Dateiinfos auslesen.


Wie muss dann der Code aussehen? Ich bekomme da immer nur 0 als Ergebnis...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
var size: cardinal;
begin
Memo1.Text:= IntToStr(GetFileVersionInfoSize('C:\1.jpg', size));
end;

_________________
Das Unmögliche wagen, um das Mögliche möglich zu machen...
Hobby-Programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Mo 26.10.09 19:56 
In meiner Delphi Hilfe gibts ein super Beispiel, bei dir sicher auch - aber ich kopier das mal trotzdem
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167

Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
BeitragVerfasst: 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.
ausblenden 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 27.10.09 01:38 
Das ist die Größe der Versionsinformationen, nicht der Datei...
Siehe Dokumentation... :roll:
msdn.microsoft.com/e...ibrary/ms647005.aspx
Vamos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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:

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:
procedure GetFilesInDirectory(Directory: stringconst 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Di 27.10.09 15:45 
Wo: Schau mal wo etwas in die Liste geschrieben wird :wink:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167

Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
BeitragVerfasst: Di 27.10.09 15:49 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das ist die Größe der Versionsinformationen, nicht der Datei...
Siehe Dokumentation... :roll:
msdn.microsoft.com/e...ibrary/ms647005.aspx


Und wie bekomme ich die größe der Datei ausgelesen?

_________________
Das Unmögliche wagen, um das Mögliche möglich zu machen...
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Di 27.10.09 16:17 
Hallo,

Dir ist doch bestimmt schon in den Codes das aufgefallen:
ausblenden Delphi-Quelltext
1:
var  SR: TSearchRec;					


Und hier mal die Struktur des Records:
ausblenden 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 :wink:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 27.10.09 16:53 
die ersten 4 Variablen haben die selbe länge?? :gruebel:

Sorry, musste einfach sein. xD

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Vamos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Di 27.10.09 18:04 
user profile iconHobby-Programmierer hat folgendes geschrieben Zum zitierten Posting springen:
Wo: Schau mal wo etwas in die Liste geschrieben wird :wink:
ausblenden 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

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:
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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 238
Erhaltene Danke: 4

Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
BeitragVerfasst: Di 27.10.09 21:35 
Maisinator Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167

Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
BeitragVerfasst: Mi 28.10.09 16:32 
user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

Dir ist doch bestimmt schon in den Codes das aufgefallen:
ausblenden Delphi-Quelltext
1:
var  SR: TSearchRec;					


Und hier mal die Struktur des Records:
ausblenden 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 :wink:

Danke. Kannst du mir auch noch sagen, was die übrigeen Parameter (Attr, Time, ExcludeAttr, FindHandle, FindData) bedeuten? Bei mir steht dazu leider nichts in der Hilfe :?:

_________________
Das Unmögliche wagen, um das Mögliche möglich zu machen...
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 167

Win XP HE SP3, Win Vista HP SP2
Delphi ;-)
BeitragVerfasst: Mi 28.10.09 16:42 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Mist! Schon wieder gepennt... :oops:

_________________
Das Unmögliche wagen, um das Mögliche möglich zu machen...