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

时间:2009-08-05 10:34:24

标签: c# .net windows

我想用FAT16文件系统初始化SD卡。 假设我的驱动器G上有SD读卡器,我怎样才能轻松将其格式化为FAT16?

更新 为了澄清,我想在.net平台上使用C#以我可以检测错误的方式执行此操作,这种方式可以在Windows XP及更高版本上运行。

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

我尝试了上面的答案,遗憾的是它看起来并不简单......

第一个答案,使用管理对象看起来是正确的方法,但遗憾的是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();

    }
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

我不相信有一种格式化驱动器的框架方式,因此您可能不得不回归

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

但是,这是一种相当脆弱的方法,如果不解析输出,您可能无法判断这是否成功。我总体上要谨慎,并问自己是否真的想在申请中提供格式。

答案 4 :(得分:1)

有大量答案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

答案 5 :(得分: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