Wie kann ich eine Diskette formatieren?


Dieses Beispiel (von Gerd Kayser) demonstriert das "stille" Formatieren eines Datenträgers. Die Routine ruft das DOS-Programm Format.com auf, darum erscheint kein Windows-Formatier-Dialog, es wird auch kein DOS-Fenster geöffnet. Nach dem Aufruf des Formatierprogramms wartet die Routine, bis das Formatieren beendet ist und prüft schließlich noch, ob die Formatierung erfolgreich war:

function TMainform.Diskette_formatieren(Laufwerk: String): Integer;
var Befehl : String;
    Datei : TextFile;
    TempDateiName : Array [0..255] of Char;
    TempVerzeichnis : Array [0..255] of Char;
    StartupInfo : TStartupInfo;
    ProcessInfo : TProcessInformation;
    SektorenProCluster : Integer;
    BytesProSektor : Integer;
    FreieCluster : Integer;
    ClusterInsgesamt : Integer;
    Temp : Integer;
begin
  // Datei zum Beantworten der Abfragen von FORMAT.EXE im Temp-Verzeichnis anlegen.
  GetTempPath(255, TempVerzeichnis);
  GetTempFileName(TempVerzeichnis, 'TMP', 0, TempDateiName);

  // Antwort-Datei erzeugen
  AssignFile(Datei, TempDateiName);
  Rewrite(Datei);             // Antwort-Datei erzeugen und öffnen
  Writeln(Datei, #13#10);     // 1. Return ("Diskette einlegen ...")
  Writeln(Datei, #13#10);     // 2. Return (Diskettenbezeichnung)
  Writeln(Datei, 'n'#13#10);  // keine weitere Diskette
  CloseFile(Datei);           // Datei schließen

  // Befehlszeile zum Aufrufen von FORMAT.COM
  // command.com /c  = automatisch nach Beendigung schließen
  // format ...  /u  = unbedingt formatieren
  // format ...  /c  = defekte Sektoren prüfen
  Befehl := 'command.com /c format '+Laufwerk+' /u /c < '+TempDateiName;

  // StartupInfo initialisieren.
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);

  // DOS-Fenster soll nicht angezeigt werden.
  StartupInfo.dwFlags := StartF_UseShowWindow;
  StartupInfo.wShowWindow := SW_Hide;

  // Formatieren
  if CreateProcess(nil, PChar(Befehl), nil, nil,
                   False, 0, nil, 'c:\',
                   StartupInfo,
                   ProcessInfo) then begin
    // Warten bis Format beendet ist.
    WaitForSingleObject(ProcessInfo.hProcess, Infinite);
    CloseHandle(ProcessInfo.hProcess);
  end;

  // Antwort-Datei wieder löschen
  DeleteFile(TempDateiName);

  // War das Formatieren erfolgreich?
  if GetDiskFreeSpace(PChar(Laufwerk), SektorenProCluster,
                      BytesProSektor, FreieCluster, 
                      ClusterInsgesamt) then begin           
    // Anzahl defekter Sektoren berechnen
    Temp := FreieCluster * SektorenProCluster * BytesProSektor;
    Result := (1457664 - Temp) div BytesProSektor;
  end
  else              
    // Diskette nicht eingelegt oder unformatiert
    Result := - 1;
end;
Delphi 1 Delphi 2 Delphi 3 Delphi 4
nicht getestet Version nicht betroffen getestet

siehe auch:

Wie stelle ich fest, ob eine Diskette im Laufwerk liegt?


Delphi FAQ