如何以编程方式使用FAT16格式化SD卡?

3

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

更新: 为了澄清,我想在.net平台上使用C#进行操作,以便我可以检测错误并且可以在Windows XP及以上版本上运行。


考虑到该问题标记为C#和.NET,我认为这应该通过编程来完成。因此,这个问题不适合在超级用户上讨论(已经有人投票关闭了)。 - balpha
2
你是指“属于超级用户”是什么意思? - Piotr Czapla
balpha说不在superuser上。请查看此页面底部的SU。 - H H
6个回答

3

我尝试了上面的答案,但很遗憾它并不像看起来那么简单...

第一个答案,使用管理对象看起来是正确的方法,但不幸的是,在Windows XP中不支持“Format”方法。

第二个和第三个答案都可以工作,但需要用户确认操作。

为了在没有任何用户干预的情况下完成该操作,我使用了第二个选项,并重定向了进程的输入和输出流。当我只重定向输入流时,进程失败了。

以下是一个示例:

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();

    }
}

2
我必须将“format”更改为“format.com”,否则它会报告文件不存在。(Windows XP SP3) - jhlllnd
@jhlllnd 我在Windows 7上也做了同样的事情。谢谢。 - Lander

3
你可以使用 pinvoke 调用 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: 转换为 6,而不是使用 "G:"[0]-'A'? - Piotr Czapla
我怎样才能确定SHFMT_ID_DEFAULT是fat16而不是32? - Piotr Czapla
你有没有注意到MSDN上的这个注释?此函数可通过Windows XP Service Pack 2(SP2)和Windows Server 2003使用。在随后的Windows版本中,它可能会被更改或不可用。 - Piotr Czapla
这个完全可以运行,但值得注意的是,它会弹出格式对话框(至少在我的WinXP上是这样的)。在我的情况下,这不是一个有帮助的用户交互体验,所以我要重新开始。 - oddmeter

1
假设您实际上是在询问如何在C#中执行此操作(从您应用于问题的标签来看):
我不认为有一种框架方式可以格式化驱动器,因此您可能需要退而求其次,采用以下方法之一。
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = "format";
processStartInfo.Arguments ="/FS:FAT G:";
Process.Start(processStartInfo);

然而,这种方法相当脆弱,如果没有解析输出,您可能无法确定是否成功。总的来说,我会谨慎考虑,并问问自己是否真的想允许应用程序内部的格式。


1

这里有一堆答案在这里

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});

我没有备用驱动器来测试,因此簇大小可能不正确。

更多信息请参见这里


你能否从文章中复制WMI方法到你的回答中,以便我可以接受你的回答?我认为在stackoverflow上有答案比原始帖子被删除要好。 - Piotr Czapla
我无法按照描述运行Format方法,因此我们最终使用带有参数的format.exe。 - Piotr Czapla
应注意以下来自MSDN Library的注释:"Windows XP及更早版本:此类不可用。" - lordhog
注意:ManagementObject位于System.Management中,默认情况下未被引用。 - dlchambers

1

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


0

如果你只是想快速格式化现有的格式类型,不需要指定任何内容。让系统使用默认值即可。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接