In der Code-Bibliothek der Delphi-Praxis findest du zwei Funktionen von sakura, mit denen du herausbekommen kannst, wieviele Laufwerke welchen Typs es im PC gibt.
Als kleine Hilfe meinerseits schlage ich folgende Typ-Funktion vor:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function IsHD(DriveByte: Byte): boolean; begin case GetDriveType(pchar(CHR(DriveByte + BYTE('A')) + ':\')) of // Festplatten DRIVE_FIXED, // gemappte Netzlaufwerke DRIVE_REMOTE, // CD-ROM-Laufwerke DRIVE_CDROM: Result := true; else Result := false; end; end; |
Auch wenn man davon ausgehen könnte, dass sie nur Festplatten zurückmeldet, habe ich zusätzlich auch CD-ROM-Laufwerke und Netzlaufwerke berücksichtigt, für den Fall, dass deine Datenbank z.B. auf einer CD ist.
In Kombination mit der Funktion "DriveExists" von sakura kannst du dann herausfinden, welche Laufwerke es gibt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var i : integer; begin // da üblicherweise die Buchstaben A & B für Disketten // reserviert sind, kann die Schleife bei C beginnen // 2 + 65 (ASCII-Code für A) = 67 (ASCII-Code für C) for i := 2 to 25 do // Laufwerk muss existieren und dem // gewünschten Typ entsprechen if(DriveExists(i)) and (IsHD(i)) then // es muss möglich sein, auf das Laufwerk // zu wechseln if(SetCurrentDir(CHR(i + BYTE('A')) + ':\')) then begin // hier geht dann die Suche los! end; end; |
Zur Suche selbst schlage ich vor, dass du dich mit den Funktionen
FindFirst,
FindNext und
FindClose auseinandersetzt. Du brauchst eine sog. rekursive Funktion, die sich quasi vom Root-Ordner nach unten durchwühlt.
Ich habe davon inzwischen mehrere Varianten gesehen. Welche nun die effizienteste ist, weiß ich nicht. Meine Testfunktion ist recht fix. Oder es liegt am 1GHz-Athlon. Wer weiß das heutzutage denn schon?
Natürlich solltest du die Suche abbrechen, sobald du die Datei gefunden hast. Ich habe das mit einer Bool-Variablen gemacht, die dann mit Hilfe von
break automatisch die
while-Schleife meiner Suchfunktion und die
for-Schleife (s. Codebeispiel) verlässt. Das spart auch ein bisschen Zeit.