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/)
-   -   USB-Laufwerk formatieren (https://www.delphipraxis.net/193035-usb-laufwerk-formatieren.html)

DeddyH 13. Jun 2017 08:56

USB-Laufwerk formatieren
 
Ich möchte Daten auf einen USB-Datenträger kopieren. Ist dieser vorher nicht leer, frage ich nach, ob er formatiert werden soll. Dazu benutze ich SHFormatDrive. Das funktioniert auch im Prinzip, allerdings habe ich während meiner Tests gelegentlich das Phänomen, dass nach dem UAC-Dialog die Caption meines Formulars (dessen Handle ich an SHFormatDrive übergebe) geändert und SHFMT_ERROR zurückgegeben wird. Leider ist das nicht reproduzierbar, könnte das daran liegen, dass ich in einer VM aus einem Mac entwickle und das USB-Durchschleifen nicht immer zu 100% klappt? Mich macht insbesondere stutzig, dass die Funktion meine Caption anfasst. Achja, hier mein Code (von SO kopiert und etwas angepasst):
Delphi-Quellcode:
const
  SHFMT_DRV_A          = 0;
  SHFMT_DRV_B          = 1;
  SHFMT_ID_DEFAULT     = $FFFF;
  SHFMT_OPT_QUICKFORMAT = 0;
  SHFMT_OPT_FULLFORMAT = 1;
  SHFMT_OPT_SYSONLY    = 2;
  SHFMT_ERROR          = -1;
  SHFMT_CANCEL         = -2;
  SHFMT_NOFORMAT       = -3;

function SHFormatDrive(
  hWnd: hWnd;
  Drive: UINT;
  fmtID: UINT;
  Options: UINT
  ): DWORD; stdcall; external 'Shell32.dll';

procedure TfrmWizard.FormatDrive(const ADrive: string);
var
  FmtRes: Longint;
  cCharTemp: Char;
  nDrive: UINT;
begin
  if (ADrive = '') or not DirectoryExists(ADrive) then
    Exit;
  cCharTemp := AnsiUpperCase(ADrive)[1];
  if GetDriveType(PChar(cCharTemp + ':\')) <> DRIVE_REMOVABLE then
    Exit;
  nDrive := Ord(cCharTemp) - Ord('A');
  try
    FmtRes := SHFormatDrive(Handle, nDrive, SHFMT_ID_DEFAULT,
      SHFMT_OPT_QUICKFORMAT);
    case FmtRes of
      SHFMT_ERROR:
        raise Exception.Create
          ('Während der Formatierung ist ein Fehler aufgetreten.');
      SHFMT_CANCEL:
        raise Exception.Create('Formatierung durch Benutzer abgebrochen.');
      SHFMT_NOFORMAT:
        raise Exception.Create('Der Datenträger kann nicht formatiert werden.');
    end;
    ...
  except
    on E: Exception do
      begin
        ...
        MessageBox(0, PChar(E.Message), 'Fehler', MB_OK or MB_ICONERROR);
      end;
  end;
end;
[edit] Ein 2. Aufruf funktioniert bislang immer, ich habe den Eindruck, das könnte evtl. an den Energiesparoptionen liegen. [/edit]

nahpets 13. Jun 2017 11:24

AW: USB-Laufwerk formatieren
 
Der Zugriff auf USB-Datenträger klappt bei meinem ollen Laptop auch nicht immer auf Anhieb. Erst der Zweite klappt dann immer.

Ursachen: Energiesparoptionen

aber auch:

Rechner aus dem Ruhezustand aufwecken, Benutzer abmelden und später wieder anmelden, sonstige längere Pausen (zumindest im Begriff auf den Zugriff auf den entsprechenden Datenträger) ...

Es gibt wohl Situationen, in denen die Verbindung zu den USB-Datenträger getrennt wird, ohne dass das zum Anwender kommuniziert wird. Auch Explorer, Windows- bzw. Total-Commander (und Co.) zeigen die Datenträger an, aber ein sofortiger Zugriff ist nicht möglich. Erst der zweite funktioniert dann.

Im Zweifelsfalle vor dem Formatieren einen Lesezugriff machen, z. B. mit FindFirst auf das Hauptverzeichnis oder sowas in der Art.

Aviator 13. Jun 2017 11:28

AW: USB-Laufwerk formatieren
 
Eventuell ist es ja auch die Energiesparfunktion des Festplatten-Controllers. Viele externe HDDs legen sich automatisch nach einer gewissen Zeit schlafen. Da kann Windows dann auch nix daran ändern. Es sei denn es würden immer wieder irgendwelche Dummy-Zugriffe darauf gemacht.

DeddyH 13. Jun 2017 12:06

AW: USB-Laufwerk formatieren
 
Zitat:

Zitat von nahpets (Beitrag 1374392)
Im Zweifelsfalle vor dem Formatieren einen Lesezugriff machen, z. B. mit FindFirst auf das Hauptverzeichnis oder sowas in der Art.

Das tue ich bereits, wenn ich eine Datei oder ein Verzeichnis ohne Systemattribut finde, kommt ja erst meine Nachfrage. Aber wenn ich da eh nichts machen kann, ist das auch nicht so wild. Ich wollte nur sichergehen, dass ich mich nicht zu blöde anstelle.

Danke

jobo 13. Jun 2017 13:14

AW: USB-Laufwerk formatieren
 
Zitat:

Zitat von Aviator (Beitrag 1374394)
Eventuell ist es ja auch die Energiesparfunktion des Festplatten-Controllers.

Konkret kann ich da nichts beitragen außer allgemein zu bestätigen. Aus einer Hardwarentwicklung, die gegen unterschiedliche USB Controler lief, hörte ich, dass die Controler bzw. deren Programmierung / Antwortverhalten recht unterschiedlich gehandhabt werden.
~ O-Ton:"Intel geht nach jedem Pups sofort wieder schlafen"
(Im Prinzip verständlich, gerade im Laptopbereich.)
~ andere machen es offenbar lockerer
Wäre dann die Frage, wie das OS seitig gehandhabt wird. Wenn man keine einheitliche Implementierung auf Treiberseite voraussetzen kann, muss das OS es machen oder Du.
Vielleicht gibt es ja "AufweckAPI".

p80286 13. Jun 2017 18:59

AW: USB-Laufwerk formatieren
 
Zitat:

Zitat von DeddyH (Beitrag 1374398)
Zitat:

Zitat von nahpets (Beitrag 1374392)
Im Zweifelsfalle vor dem Formatieren einen Lesezugriff machen, z. B. mit FindFirst auf das Hauptverzeichnis oder sowas in der Art.

Das tue ich bereits, wenn ich eine Datei oder ein Verzeichnis ohne Systemattribut finde, kommt ja erst meine Nachfrage. Aber wenn ich da eh nichts machen kann, ist das auch nicht so wild. Ich wollte nur sichergehen, dass ich mich nicht zu blöde anstelle.

Danke

Es könnte auch sein, das dieser "Initialzugriff" aus dem Cache bedient wird, und sich niemand so richtig angesprochen fühlt.

Gruß
K-H

t.roller 13. Jun 2017 19:40

AW: USB-Laufwerk formatieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Check Disk and Format Disk component

DeddyH 13. Jun 2017 19:48

AW: USB-Laufwerk formatieren
 
Danke, aber so weit möchte ich gar nicht gehen. Trotzdem werde ich den Link mal im Hinterkopf behalten, sieht ja nicht uninteressant aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 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