2010-04-15 14 views
7

Ich möchte ein Laufwerk in C++ formatieren, aber wenn ich versuchte, Format-Funktion von windows.h Ich konnte nicht finden, eine Probe oder die Art der Verwendung von. Ich möchte auch nicht von Benutzer interagieren, um in Ordnung zu kommen oder abbrechen, so kann ich nicht SHFormat verwendenFormat Laufwerk von C++

Weiß jemand, wie kann ich das tun?

+4

Was "Format-Funktion von windows.h" wäre das? –

+0

Kannst du nicht einfach aushelfen? – ryeguy

+1

Aus irgendeinem Grund gibt mir das Formatieren einer Festplatte ohne Benutzerakzeptation ziemlich viel Ruhe. Es wird auch Spaß machen, es zu testen. –

Antwort

5

Sie können CreateProcess verwenden, um eine versteckte Kopie des Befehls cmd.exe Format zu starten, und es Zeichen füttern, um die Aufforderung zu behandeln. Dies ist in Pascal, aber es ist alles API-Aufrufe, so sollte es ziemlich leicht übersetzen. Sie müssen auch einige Fehlerbehandlung hinzufügen, und stellen Sie sicher, dass Sie es ausgiebig testen.

Win32_Volume :: Format wurde nur in Windows 2003 hinzugefügt, so dass es nicht funktioniert, wenn Sie WinXP oder Win2K-Unterstützung benötigen.

procedure FormatFloppy; 
var 
    sa: TSecurityAttributes; 
    si: TStartupInfo; 
    pi: TProcessInformation; 
    BytesWritten: LongWord; 
    hInRead, hInWrite: THandle; 
begin 
    // Initialize security information 
    sa.nLength := SizeOf(sa); 
    sa.lpSecurityDescriptor := nil; 
    sa.bInheritHandle := True; 
    CreatePipe(hInRead, hInWrite, @sa, 0); 
    // Initialize startup info 
    ZeroMemory(@si, SizeOf(si)); 
    si.cb := SizeOf(si); 
    si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 
    si.wShowWindow := SW_HIDE; 
    si.hStdInput := hInRead; 
    si.hStdOutput := GetStdHandle(STD_OUTPUT_HANDLE); 
    si.hStdError := GetStdHandle(STD_ERROR_HANDLE); 
    // Start process 
    ZeroMemory(@pi, SizeOf(pi)); 
    CreateProcess(nil, 'cmd /c format a: /fs:FAT /F:1.44 /V:', nil, nil, True, 
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi); 
    CloseHandle(pi.hThread); 
    CloseHandle(hInRead); 
    // Write '<enter>' to start processing, and 'n<enter>' to respond to question at end 
    WriteFile(hInWrite, #13#10'N'#13#10, 5, BytesWritten, nil); 
    CloseHandle(hInWrite); 
    // Wait for process to exit 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
end; 
+0

finden Ich habe keine Festplatte, um dies zu versuchen, aber ich denke, es ist der beste Weg, es zu tun. +1 –

+0

Spawning eine Konsole + format.com ist eine Möglichkeit, es zu tun, aber ist sicherlich nicht "alle API-Aufrufe". – GravityWell

+0

@GravityWell Dieser Kommentar war in Bezug auf Pascal-Code, der nur Win32-API-Funktionen ohne Aufrufe in Pascal RTL verwendet, die es ermöglichen würde, leicht auf C++ portiert werden. Es hatte nichts mit den Implementierungsdetails zu tun, die, obwohl zugegebenermaßen janky, waren/waren, was verfügbar war. –

7

Sie können die Funktion SHFormatDrive verwenden, um das Dialogfeld "Laufwerk formatieren" in Windows anzuzeigen.

1

C++ bietet keine solche Low-Level-API.

Welche OS/Plattform verwenden Sie?

Unter Windows gibt es einen WMI-API, die das tut: Win32_Volume Format

Oder Sie könnten mit "System" (? Oder unter Windows "ShellExecute") versuchen;

Viel Glück.

max.

+0

Ich weiß, dass api, was ich nicht verwenden kann Ich meine, ich konnte keinen Beispielcode für die Verwendung dieser – JGC

2

Der richtige Weg, es zu tun ist Virtual Disk Service FormatPartition Methode zu verwenden.

+0

-1: Dies ist keine vollständige Antwort, sollte wahrscheinlich ein Kommentar sein, und ist nicht unbedingt wahr. Formatieren eines Laufwerks und Formatieren einer Partition sind einfach verschiedene Aufgaben. Beachten Sie auch, dass diese Frage 3,5 Jahre alt ist. – Potatoswatter

+0

Das Problem mit diesem Ansatz ist, dass es nicht vor Vista funktioniert – felknight