AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

USB-Laufwerk formatieren

Ein Thema von DeddyH · begonnen am 13. Jun 2017 · letzter Beitrag vom 13. Jun 2017
Antwort Antwort
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#1

USB-Laufwerk formatieren

  Alt 13. Jun 2017, 09:56
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (13. Jun 2017 um 09:58 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: USB-Laufwerk formatieren

  Alt 13. Jun 2017, 12:24
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: USB-Laufwerk formatieren

  Alt 13. Jun 2017, 12:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#4

AW: USB-Laufwerk formatieren

  Alt 13. Jun 2017, 13:06
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: USB-Laufwerk formatieren

  Alt 13. Jun 2017, 14:14
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".
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: USB-Laufwerk formatieren

  Alt 13. Jun 2017, 19:59
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#7

AW: USB-Laufwerk formatieren

  Alt 13. Jun 2017, 20:40
Check Disk and Format Disk component
Miniaturansicht angehängter Grafiken
magenta-diskfmt.jpg  

Geändert von t.roller (13. Jun 2017 um 20:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#8

AW: USB-Laufwerk formatieren

  Alt 13. Jun 2017, 20:48
Danke, aber so weit möchte ich gar nicht gehen. Trotzdem werde ich den Link mal im Hinterkopf behalten, sieht ja nicht uninteressant aus.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 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