Thema: Delphi USB Stick formatiern

Einzelnen Beitrag anzeigen

HW764
(Gast)

n/a Beiträge
 
#10

Re: USB Stick formatiern

  Alt 1. Sep 2004, 14:02
Geht sicher auch mit dem Disketten Formatierung Kommando
Delphi-Quellcode:
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;
  Mit Zitat antworten Zitat