【问题标题】:How to programatically format an SD card with FAT16?如何使用 FAT16 以编程方式格式化 SD 卡?
【发布时间】:2010-11-16 23:20:38
【问题描述】:

我想用 FAT16 文件系统初始化 SD 卡。 假设我的 SD 读卡器在驱动器 G: 上,如何轻松将其格式化为 FAT16?

更新: 澄清一下,我想在 .net 平台上使用 C# 以一种我可以检测错误并且适用于 Windows XP 及更高版本的方式来执行此操作。

【问题讨论】:

  • 考虑到问题被标记为 c# 和 .net,我想这是以编程方式完成的。因此,这个问题不属于超级用户(对此进行了密切投票)。
  • “属于超级用户”是什么意思?
  • balpha 在超级用户上说 not。 SU 见本页底部

标签: c# .net windows


【解决方案1】:

我尝试了上面的答案,不幸的是它并不像看起来那么简单......

第一个答案,使用管理对象看起来是正确的做法,但不幸的是 windows xp 不支持“格式”方法。

第二个和第三个答案都有效,但需要用户确认操作。

为了在没有用户干预的情况下做到这一点,我使用了第二个选项来重定向进程的输入和输出流。当我只重定向输入流时,进程失败了。

以下是一个例子:

DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
    if (d.IsReady && (d.DriveType == DriveType.Removable))
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = "format";
        startInfo.Arguments = "/fs:FAT /v:MyVolume /q " + d.Name.Remove(2);
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = true;
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardInput = true;

        Process p = Process.Start(startInfo);

        StreamWriter processInputStream = p.StandardInput;
        processInputStream.Write("\r\n");

        p.WaitForExit();

    }
}

【讨论】:

  • 我必须将“format”更改为“format.com”,否则会报告该文件不存在。 (Windows XP SP3)
  • @jhlllnd 我必须在 Windows 7 上做同样的事情。谢谢。
【解决方案2】:

你可以使用pinvoke to call SHFormatDrive

[DllImport("shell32.dll")]
static extern uint SHFormatDrive(IntPtr hwnd, uint drive, uint fmtID, uint options);

public enum SHFormatFlags : uint {
     SHFMT_ID_DEFAULT = 0xFFFF,
     SHFMT_OPT_FULL = 0x1,
     SHFMT_OPT_SYSONLY = 0x2,
     SHFMT_ERROR = 0xFFFFFFFF,
     SHFMT_CANCEL = 0xFFFFFFFE,
     SHFMT_NOFORMAT = 0xFFFFFFD,
}

//(Drive letter : A is 0, Z is 25)

uint result = SHFormatDrive( this.Handle, 
              6, // formatting C:
              (uint)SHFormatFlags.SHFMT_ID_DEFAULT,
              0 ); // full format of g:
if ( result == SHFormatFlags.SHFMT_ERROR ) 
    MessageBox.Show( "Unable to format the drive" );

【讨论】:

  • 有什么比“G:”[0]-'A' 更安全的方式将 G: 转换为 6?
  • 如何确定 SHFMT_ID_DEFAULT 是 fat16 而不是 32?
  • 你注意到 MSDN 上的这个注释了吗?此功能在 Windows XP Service Pack 2 (SP2) 和 Windows Server 2003 中可用。在 Windows 的后续版本中可能会更改或不可用
  • 这完全可行,但应该注意的是,这将打开“格式”对话框(至少在 WinXP 上对我来说是这样)。在我的场景中,这不是一个有用的用户交互体验,所以我又回到了绘图板上。
【解决方案3】:

在 DriveInfo 等中找不到函数,但您始终可以使用(创建)包含 Format G: /FS:FAT 的批处理文件并使用 System.Diagnostics.Process 启动它

【讨论】:

    【解决方案4】:

    假设您实际上是在询问如何在 C# 中执行此操作(来自您应用于问题的标签):

    我不相信有格式化驱动器的框架方法,因此您可能不得不退回到类似于

    ProcessStartInfo processStartInfo = new ProcessStartInfo();
    processStartInfo.FileName = "format";
    processStartInfo.Arguments ="/FS:FAT G:";
    Process.Start(processStartInfo);
    

    但是,这是一种非常脆弱的方法,如果不解析输出,您可能无法判断这是否成功。总体而言,我会保持谨慎,并问自己是否真的要在应用程序中允许格式。

    【讨论】:

      【解决方案5】:

      有很多答案here

      WMI 方法似乎没有 C# 示例,但我四处寻找并构建了这个:

      ManagementObject disk = new ManagementObject("SELECT * FROM Win32_Volume WHERE Name = 'G:\\\\'");
      disk.Get();
      disk.InvokeMethod("Format", new object[] {"FAT", false, 4096, "TheLabel", false});
      

      我没有备用驱动器来测试这个,所以集群大小可能是错误的。

      请参阅here 了解更多信息。

      【讨论】:

      • 能否将 WMI 方法复制到文章中的答案中,以便我接受您的答案?我认为最好在stackoverflow中找到答案,以防原帖被删除。
      • 我无法按照描述运行 Format 方法,所以我们最终使用带参数的 format.exe。
      • 应注意来自MSDN Library 的以下注释:“Windows XP 及更早版本:此类不可用。”
      • 注意:ManagementObject在System.Management中,默认不被引用。
      【解决方案6】:

      如果您只想要现有格式类型的快速格式,则无需指定任何内容。让系统使用默认值。

      ProcessStartInfo startInfo = new ProcessStartInfo();
      startInfo.FileName = "format.com";
      startInfo.Arguments = $"{drive} /V:{volumeName} /Q"
      startInfo.UseShellExecute = false;
      startInfo.CreateNoWindow = true;
      startInfo.RedirectStandardOutput = true;
      startInfo.RedirectStandardInput = true;
      Process.Start(startInfo);
      
      //because there will be a prompt, this input by passes that prompt.
      StreamWriter processInputStream = p.StandardInput;
      processInputStream.Write("\r\n");
      

      在命令提示符下是这样的:

      format.com H: /V:MyVolumeName /Q
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 2012-01-10
        • 1970-01-01
        • 2012-09-11
        • 2013-02-05
        • 2011-06-05
        • 1970-01-01
        相关资源
        最近更新 更多