Autor Beitrag
MaxiTB
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: Fr 25.04.03 13:55 
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*) ?

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.


Zuletzt bearbeitet von MaxiTB am Mo 28.04.03 09:42, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
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:
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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: 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.

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: 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 ;-) ).

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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:
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:
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..6of String = ('Unbekanntes Laufwerk',
                                        'Kein Stammlaufwerk',
                                        'Wechseldatenträger',
                                        'Festplatte',
                                        'Netzlaufwerk',
                                        'CD-Rom-Laufwerk',
                                        'Speicherlaufwerk');
var
  NodeData: PNodeData;
  Node: PVirtualNode;
  R: DWord;
  Drives: Array[0..128of 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;
//        Size := 0;
        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{, SelectedIndex}, 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, nil0then begin
    if Trim(StrPas(Buf)) <> '' then
      Result := StrPas(Buf) + ' '
    else
      Result := '';
  end
  else
    Result := '';
end;
Teile davon sind, glaub ich, vom SwissDelphiCenter.

Gruß wulfskin!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
MaxiTB Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: 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*.

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.