2010-04-15 26 views
7

Quiero formatear una unidad en C++, pero cuando traté de usar la función Format de windows.h no pude encontrar una muestra o la forma de usar eso. Tampoco quiero interactuar con el usuario para estar bien o cancelar, así que no puedo usar SHFormatUnidad de formato por C++

¿Alguien sabe cómo puedo hacer eso?

+4

¿Qué "función de formato de windows.h" sería esa? –

+0

¿No puedes simplemente pagar? – ryeguy

+1

Por alguna razón, formatear un disco duro sin la aceptación del usuario me da escalofríos. Va a ser divertido probarlo también. –

Respuesta

5

Puede usar CreateProcess para iniciar una copia oculta del comando de formato cmd.exe y alimentarlo con caracteres para manejar la solicitud. Esto está en Pascal, pero se trata de todas las llamadas API, por lo que debe traducirse con bastante facilidad. También deberá agregar un poco de manejo de errores, y asegúrese de probarlo extensivamente.

Win32_Volume :: El formato solo se agregó en Windows 2003, por lo que no funcionará si necesita compatibilidad con WinXP o Win2K.

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

No tengo disco para probar esto, pero creo que es la mejor manera de hacerlo. +1 –

+0

Engendrar una consola + format.com es una forma de hacerlo, pero ciertamente no es "todas las llamadas API". – GravityWell

+0

@ GravityWell Ese comentario se refería a que era un código de Pascal que solo usaba las funciones de la API de Win32 sin llamadas al Pascal RTL, lo que le permitiría portarlo a C++ fácilmente. No tiene nada que ver con los detalles de la implementación, que, si bien son janky, son/estaban lo que estaba disponible. –

7

Puede usar la función SHFormatDrive para mostrar el cuadro de diálogo Dar formato a la unidad en Windows.

1

C++ no ofrece un nivel tan bajo de API.

¿Qué sistema operativo/plataforma está utilizando?

En Windows, hay una API de WMI que hace eso: Win32_Volume Format

O usted podría tratar de usar "sistema" (? O en Windows, "ShellExecute");

Buena suerte.

Max.

+0

Sé que api qué no puedo usarlo Quiero decir que no pude encontrar ningún código de muestra para usar ese – JGC

2

La forma correcta de hacerlo es utilizar el método virtual Servicio de disco FormatPartition.

+0

-1: Esta no es una respuesta completa, probablemente debería ser un comentario, y no necesariamente es verdad. Formatear una unidad y formatear una partición son simplemente tareas diferentes. Además, tenga en cuenta que esta pregunta tiene 3,5 años. – Potatoswatter

+0

El problema con este enfoque es que no funciona antes Vista – felknight