【问题标题】:Format drive by c++c++格式化驱动
【发布时间】:2018-10-11 18:12:19
【问题描述】:

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

有人知道我该怎么做吗?

【问题讨论】:

  • 那是什么“windows.h的格式化函数”?
  • 出于某种原因,在没有用户接受的情况下格式化硬盘让我感到很寒心。测试也会很有趣。
  • @Michael:是的,测试确实很有趣,尽管使用闪存驱动器很容易测试。
  • 这里也有人问过类似的问题:stackoverflow.com/questions/7227835/…

标签: c++ winapi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用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;
    

    【讨论】:

    • 我没有磁盘可以尝试,但我认为这是最好的方法。 +1
    • 生成控制台+format.com 是一种方法,但肯定不是“所有 API 调用”。
    • @GravityWell 该评论是关于它是仅使用 Win32 API 函数而不调用 Pascal RTL 的 Pascal 代码,这将允许它轻松地移植到 C++。它与实现细节无关,虽然公认的 janky 很笨拙,但它们是/曾经是可用的。
    【解决方案3】:

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

    【讨论】:

    • -1:这不是一个完整的答案,应该是评论,不一定是真的。格式化驱动器和格式化分区只是不同的任务。另外,请注意,这个问题已有 3.5 年历史。
    • 这种方法的问题是它在 Vista 之前不起作用
    【解决方案4】:

    C++ 不提供这样低级的 API。

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

    在 Windows 上,有一个 WMI API 可以做到这一点:Win32_Volume Format

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

    祝你好运。

    最大。

    【讨论】:

    • 我知道那个 api 我不能使用它。我的意思是我找不到任何使用它的示例代码
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2011-12-25
      • 2011-04-22
      • 2012-11-21
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多