Entwickler-Ecke
Dateizugriff - Was gefinkeltes (Enumerieren von Laufwerken) ...
MaxiTB - Fr 25.04.03 13:55
Titel: Was gefinkeltes (Enumerieren von Laufwerken) ...
Ich möchte auf einem System alle vorhanden Volumes enumerieren.
Sprich A:, C:, D:, usw.
Allerdings möchte ich auch zusätzlich zum Namen noch prinzipielle Geräteinformationen erhalten ... extakt: ReadOnly und Removeable.
Tjo - und jetzt wirds gefinkelt ... eigentlich nicht nur unter Windows sondern auch unter Linux (also die gemounteten Devices plus eben den Pfad dazu - keine Angst, Win32 reicht einmal für den Anfang *g*).
Hat jemand eine Idee, wie ich die Infos rausbekommen ohne einen Zugriff auf die Volumes zu machen (ich sag nur Diskratterratterratter *g*) ?
Delete - Fr 25.04.03 19:13
Ich weiß nicht, was "gefinkelt" bedeuted, aber es ist auch egal was es bedeutet, ein aussagekräftiges Topic ist es auf keinen Fall, was auch immer es bedeuten mag. :roll:
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:
| function DriveIsReady(Drive : String) : Boolean; var i : Integer; sRec: TSearchRec; begin i := FindFirst(Drive + ':\*.*', faAnyFile, sRec); if i = 0 then begin Result := True; end else begin Result := False; end; FindClose(sRec); end;
procedure TForm1.Button1Click(Sender: TObject); var i : Integer; s : String; begin for i := 67 to 90 do begin if DriveIsReady(chr(i)) then s := s + chr(i)+ ' '; end; ShowMessage(s); end; |
Und den Laufwerkstyp mit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function TForm1.laufwerkstyp(laufwerk: string): string; var Typ: integer; begin Typ:=GetDriveType(PChar(laufwerk)); case Typ of DRIVE_REMOTE : Result:='Netzlaufwerk'; DRIVE_RAMDISK : Result:='RAMDisk'; DRIVE_CDROM : Result:='CDROM'; DRIVE_FIXED : Result:='Festplatte'; DRIVE_REMOVABLE : Result:='Diskette'; end; end; |
MaxiTB - Mo 28.04.03 09:45
Titel: Enumerieren ...
@Luckie
Gefinkelt ? Selbe wie fuchsig :wink: ...
Ähm ... Code 1 hat eben den Nachteil des Zugriffs aufs Laufwerk ... aber die zweite Variante ist spitze ... was Windose angeht ... fehlt ja eigentlich nur noch die Linux-Variante ...
@Tino
Uupsss ... sorry ... schon geändert.
Delete - Mo 28.04.03 14:51
Ohne Zugriff auf das Laufwerk, wirst du es nicht prüfen können. Wenn ich im Dunkeln wissen will, ob meine Freundin neben mir liegt, muß ich auch tasten und sie berühren. :wink:
MaxiTB - Mo 28.04.03 15:03
Titel: Stimmt nicht ganz ...
Windows checkt schon beim Starten alle verfügbaren Device-Informationen (Linux hat eine mount list; nur wie krieg ich die Infos) - ich will ja nicht wissen, wie der Datenträger im Laufwerk heißt, sondern was für ein Gerät es ist (siehe erstes Posting) ... dafür ist wirklich kein Zugriff nötig und bei vielen Apps die ich kenne, wird auch keiner gemacht (denke nur mal an die lustige MS DriveList Combo ... da rattert auch erst das Diskdrive, wenn man es auswählt ;-) ).
wulfskin - Mo 28.04.03 16:02
Hallo MaxiTB!
Ich habe im Moment wenig Zeit, kann dir deshalb nur ein Codeschnipsel aus einem meiner Programme anbieten. Ich hoffe das wichtigste findest du daraus heraus:
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: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| procedure TMainForm.AddDrives(Drive: String); const DriveTypes: Array [0..6] of String = ('Unbekanntes Laufwerk', 'Kein Stammlaufwerk', 'Wechseldatenträger', 'Festplatte', 'Netzlaufwerk', 'CD-Rom-Laufwerk', 'Speicherlaufwerk'); var NodeData: PNodeData; Node: PVirtualNode; R: DWord; Drives: Array[0..128] of Char; pDrive: PChar; DriveType: Integer; begin FilesVST.Clear; R := GetLogicalDriveStrings(SizeOf(Drives), Drives); if R <> 0 then begin if R > SizeOf(Drives) then begin raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY)); Exit; end; pDrive := Drives; while pDrive^ <> #0 do begin New(NodeData); with NodeData^ do begin with FileData do begin Name := pDrive; IsDirectory := True; end; DriveType := GetDriveType(PChar(Upcase(pDrive[0]) + ':\')); if DriveType in [DRIVE_FIXED, DRIVE_CDROM] then Caption := GetDriveName(pDrive) + '(' + Upcase(pDrive[0]) + ':)' else Caption := DriveTypes[DriveType] + ' (' + Upcase(pDrive[0]) + ':)'; Name := pDrive[0] + ':'; AddFileIcon(FileData.Name, ImageIndex, False); end; Node := AddNode(nil, NodeData); if not IsEmptyDir(Drive) then FilesVST.AddChild(Node); Inc(pDrive, 4); end; end else MessageDlg('Fehler beim Laden der Laufwerke!', mtError, [mbOk], 0); end;
function GetDriveName(const Drive: String): String; var MaxLength, Flags: DWord; Buf: Array[0..MAX_PATH] of Char; begin if GetVolumeInformation(PChar(Drive), Buf, SizeOf(Buf), nil, MaxLength, Flags, nil, 0) then begin if Trim(StrPas(Buf)) <> '' then Result := StrPas(Buf) + ' ' else Result := ''; end else Result := ''; end; |
Teile davon sind, glaub ich, vom SwissDelphiCenter.
Gruß wulfskin!
MaxiTB - Mo 28.04.03 16:06
Titel: Daunkschen !
Hab mir schon die GetDriveType reingezogen - allerdings hab ich noch keine Kylix Lösung ... die Windows Variante läuft aber schon ohne Rattern *g*.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!