Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wechseldatenträger erkennen ? (https://www.delphipraxis.net/54121-wechseldatentraeger-erkennen.html)

shmia 28. Sep 2005 13:13


Wechseldatenträger erkennen ?
 
Wie kann man erkennen,
  • ob es sich bei einem Laufwerksbuchstaben um einen Wechseldatenträger (Dieskette) handelt ?
  • ob der Datenträger eingelegt ist
  • ob er beschreibbar (ohne eine Dummydatei erzeugen zu müssen) ist ?

NicoDE 28. Sep 2005 13:43

Re: Wechseldatenträger erkennen ?
 
Siehe MSDN-Library durchsuchenGetDriveType und MSDN-Library durchsuchenGetVolumeInformation.

Kroko1999 28. Sep 2005 13:49

Re: Wechseldatenträger erkennen ?
 
Forum-Suche benutzen :?:

shmia 28. Sep 2005 15:27

Re: Wechseldatenträger erkennen ?
 
Die ersten beiden Probleme sind nun gelöst, aber wie kann man feststellen, ob man schreiben darf ?
Und zwar ohne eine Dummydatei zu erzeugen und kompatibel zu allen Win32 Versionen.
Das Flag FILE_READ_ONLY_VOLUME gibt's erst ab WinXP aufwärts

Delphi-Quellcode:
function GetDriveName(const path:string):string;
begin
   Result := ExtractFileDrive(path);
   if Result <> '' then
      Result := Result+ '\';
end;


function IsRemovableDrive(const path:string):Boolean;
var
   vol : string;
begin
   vol := GetDriveName(path);
   if vol = '' then
      Result := False
   else
      Result := GetDriveType(PChar(vol))=DRIVE_REMOVABLE;
end;

function IsDriveAvailable(const path:string):Boolean;
var
   vol : string;
   maxcomplen : DWORD;
   flags : Cardinal;
begin
   vol := GetDriveName(path);
   if vol = '' then
      Result := False
   else
      Result := GetVolumeInformation(PChar(vol), nil, 0, nil, maxcomplen, flags, nil, 0);
end;


// Prüfen, ob ein Volume beschreibbar ist
function IsVolumeOK(const path:string):Boolean;
begin
   if IsRemovableDrive(path) then
   begin
      Result := IsDriveAvailable(path);

      while not Result do
      begin
         if (MessageDlg('Please insert Disk in Drive '+GetDriveName(path), mtWarning, [mbOK, mbCancel], 0) = mrCancel) then
            Exit;

         Result := IsDriveAvailable(path);
      end;
   end
   else
      Result := IsDriveAvailable(path);
end;

himitsu 28. Sep 2005 15:31

Re: Wechseldatenträger erkennen ?
 
Die einzig sichere Methode ist und bleibt nunmal das Testen (einfach drauf losschreiben)

Dat Einzige, wo du dir ja schon fast sicher sein kannst, das du da net schreiben kannst, dat sind die CD-Laufwerke.

Luckie 28. Sep 2005 15:37

Re: Wechseldatenträger erkennen ?
 
Nico hat gerade gestern Code gepostet wie man unter NTFS genau das rausfinden kann.

NicoDE 28. Sep 2005 15:57

Re: Wechseldatenträger erkennen ?
 
Zitat:

Zitat von Luckie
Nico hat gerade gestern Code gepostet wie man unter NTFS genau das rausfinden kann.

Das betraf nur die Sicherheitsbeschreibungen (es bringt nichts auf einem mit NFTS-formatierten USB-Stick schreiben zu dürfen, es aber es nicht zu können, weil der Schreibschutzschalter aktiviert ist).

Kurz: Es geht nicht anders als durch Probieren (nichts anderes macht zum Beispiel der Datei-Dialog der Shell - dort kann man dies übrigens per Flag deaktivieren (nervt wenn man Dateien erstellen aber nicht löschen kann *g*)).

shmia 28. Sep 2005 16:48

Re: Wechseldatenträger erkennen ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke an alle.
Ich habe nun eine Lösung, die es Wert wäre in die Code-Library aufgenommen zu werden.

NicoDE 28. Sep 2005 17:03

Re: Wechseldatenträger erkennen ?
 
Hartcodierte Dateinamen für temporäre Dateien sind keine gute Idee (IsWriteable).
Vielleicht solltest Du dir MSDN-Library durchsuchenGetTempFileName ansehen.

Zudem macht das Erstellen teilweise Probleme wenn das Limit der Dateianzahl im Wurzelverezeichnis erreicht ist (formatierte Diskette einlegen und in der Konsole (Windows XP mit aktivierten Erweiterungen für die Kommandozeile) '@for /L %i in (0,1,255) do @echo %i && @type nul > A:\TEST%i.TMP' eingeben um die Diskette voll zu bekommen).


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz