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..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!


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*.