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?