用c++格式化驱动器

问题描述 投票:0回答:6

我想用c++格式化驱动器,但是当我尝试使用windows.h的Format函数时,我找不到示例或使用它的方法。 我也不想通过用户交互来确定或取消,所以我不能使用 SHFormat

有人知道我该怎么做吗?

c++ winapi
6个回答
7
投票

您可以使用 SHFormatDrive 函数在 Windows 中显示“格式化驱动器”对话框。


4
投票

您可以使用 CreateProcess 启动 cmd.exe 格式命令的隐藏副本,并为其提供字符来处理提示。 这是 Pascal 语言,但都是 API 调用,所以应该很容易翻译。 您还需要添加一些错误处理,并确保对其进行广泛的测试。

Win32_Volume::Format 仅在 Windows 2003 中添加,因此如果您需要 WinXP 或 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;

3
投票

正确的做法是使用虚拟磁盘服务FormatPartition方法。


1
投票

C++ 不提供如此低级的 API。

您使用什么操作系统/平台?

在 Windows 上,有一个 WMI API 可以执行此操作:Win32_Volume Format

或者你可以尝试使用“system”(或者在 Windows 上,“ShellExecute”?);

祝你好运。

最大。


0
投票

您可以调用

system("format  C: /FS:NTFS /X /Q /y");
,其中“C:”是要格式化的磁盘。


0
投票

您可以使用Vds

  1. 使用 CoCreateInstance 加载 IVdsServiceLoader。
  2. 从中获取 IVdsService 并调用它的 WaitForServiceReady();
  3. 调用它的 QueryProviders 并传递 VDS_QUERY_SOFTWARE_PROVIDERS
  4. 查询返回的 IUnknown 的 FOR IVdsSwProvider
  5. 调用提供商的QueryPack。可以查询 IVdsPack 的 IUnknowns。
  6. 对于每个包,调用 QueryDisks。可以查询这些 IUnknowns FOR IVdsDisk。
  7. 查询您要格式化为 IVdsAdvancedDisk 的 IVdsDisk。

您现在可以调用 FormatPartition 的接口了。

例如,请参阅我在格式化 VHD 磁盘

中的回答
© www.soinside.com 2019 - 2024. All rights reserved.