2010-04-15 43 views
7

Tôi muốn định dạng ổ đĩa bằng C++, nhưng khi tôi cố gắng sử dụng chức năng Định dạng của windows.h Tôi không thể tìm thấy mẫu hoặc cách sử dụng mẫu đó. Tôi cũng không muốn tương tác với người dùng để có được ok hoặc hủy bỏ vì vậy tôi không thể sử dụng SHFormatĐịnh dạng ổ đĩa bằng C++

Có ai biết làm thế nào tôi có thể làm điều đó?

+4

"Định dạng chức năng của windows.h" sẽ là gì? –

+0

Bạn không thể chỉ ra ngoài? – ryeguy

+1

Vì lý do nào đó, việc định dạng ổ đĩa cứng mà không có sự chấp nhận của người dùng sẽ khiến tôi khá lạnh. Sẽ rất vui khi thử nghiệm. –

Trả lời

5

Bạn có thể sử dụng CreateProcess để khởi chạy bản sao ẩn của lệnh định dạng cmd.exe và cấp dữ liệu ký tự đó để xử lý lời nhắc. Đây là trong Pascal, nhưng đó là tất cả các cuộc gọi API, vì vậy nó nên dịch khá dễ dàng. Bạn cũng sẽ cần phải thêm một số lỗi xử lý và đảm bảo bạn kiểm tra nó một cách rộng rãi.

Win32_Volume :: Định dạng chỉ được thêm vào Windows 2003, vì vậy nó sẽ không hoạt động nếu bạn cần hỗ trợ WinXP hoặc 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

Tôi không có đĩa để thử điều này trên, nhưng tôi nghĩ rằng đó là cách tốt nhất để làm điều đó. +1 –

+0

Tạo ra một giao diện điều khiển + format.com là một cách để làm điều đó, nhưng chắc chắn không phải là "tất cả các cuộc gọi API". – GravityWell

+0

@GravityWell Đó là bình luận liên quan đến nó là mã Pascal chỉ sử dụng các hàm API Win32 mà không cần các cuộc gọi vào Pascal RTL, mà sẽ cho phép nó được chuyển đến C++ dễ dàng. Nó không liên quan gì đến các chi tiết thực hiện, trong đó, trong khi thừa nhận là janky, là/là những gì đã có sẵn. –

7

Bạn có thể sử dụng chức năng SHFormatDrive để hiển thị hộp thoại Định dạng Drive trong Windows.

1

C++ không cung cấp API cấp thấp như vậy.

Bạn đang sử dụng hệ điều hành/nền tảng nào?

Trên Windows, Có một API WMI nào đó: Win32_Volume Format

Hoặc bạn có thể thử sử dụng "hệ thống" (? Hay trên Windows, "ShellExecute");

Chúc may mắn.

CPC

+0

Tôi biết rằng api những gì tôi không thể sử dụng nó Tôi có nghĩa là tôi không thể tìm thấy bất kỳ mã mẫu để sử dụng mà – JGC

2

Cách chính xác để thực hiện là sử dụng phương pháp dịch vụ đĩa ảo FormatPartition.

+0

-1: Đây không phải là câu trả lời hoàn chỉnh, có lẽ nên là nhận xét và không nhất thiết phải đúng. Định dạng một ổ đĩa và định dạng phân vùng chỉ đơn giản là các nhiệm vụ khác nhau. Ngoài ra, lưu ý rằng câu hỏi này là 3,5 tuổi. – Potatoswatter

+0

Vấn đề với cách tiếp cận này là nó không hoạt động trước Vista – felknight

Các vấn đề liên quan