You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C#调用P2FormatApp.exe对P2 SD卡执行格式化?

解决P2FormatApp.exe调用失败及SD卡卷标设为序列号问题

一、先搞定"找不到指定文件"的错误

1. 定位P2FormatApp.exe的真实路径

手动右键能启动程序,说明它肯定在系统里:

  • 右键启动格式化窗口后,打开任务管理器,找到P2FormatApp.exe进程,右键选择「打开文件所在位置」,复制完整路径(大概率在C:\Windows\System32或C:\Windows\SysWOW64,也可能在P2驱动的安装目录)。
  • 也可以通过注册表查找:打开regedit,搜索P2FormatApp.exe,找到对应的路径项。

2. 代码中必须指定完整路径

你之前只写了P2FormatApp.exe,加上UseShellExecute=false的设置后,Process不会自动搜索系统PATH或关联程序,必须写完整路径:

startInfo.FileName = @"C:\Windows\System32\P2FormatApp.exe"; // 替换成你实际找到的路径

3. 配对正确的工作目录

如果程序依赖所在目录的配套文件,把WorkingDirectory设为程序所在目录:

startInfo.WorkingDirectory = Path.GetDirectoryName(startInfo.FileName);

二、把SD卡序列号设为卷标

1. 编写方法获取驱动器序列号

用DriveInfo类就能获取,转成十六进制字符串(和系统显示的序列号格式一致):

private static string GetDriveSerial(string driveLetter)
{
    var drivePath = driveLetter.EndsWith(":") ? driveLetter : $"{driveLetter}:";
    var drive = new DriveInfo(drivePath);
    return drive.SerialNumber.ToString("X").ToUpper();
}

记得引用System.IO命名空间。

2. 动态替换卷标参数

把原来的固定卷标MyVolume替换成获取到的序列号:

var targetDrive = "E";
var serial = GetDriveSerial(targetDrive);
startInfo.Arguments = $"/fs:FAT /v:{serial} /q {targetDrive}:"; // 驱动器加冒号避免歧义

三、其他坑点修正

1. UseShellExecute的选择

如果还是有启动问题,试试把UseShellExecute改成true——这和手动右键格式化的逻辑一致,依赖系统关联,但此时不能使用输入输出重定向(注释掉Redirect相关配置):

startInfo.UseShellExecute = true;
// startInfo.RedirectStandardOutput = true;
// startInfo.RedirectStandardInput = true;
startInfo.CreateNoWindow = false; // 需要显示格式化窗口就设为false

2. 必须拥有管理员权限

格式化SD卡需要管理员权限,给程序添加权限:
右键项目→属性→安全性→勾选「启用ClickOnce安全设置」,打开app.manifest,将requestedExecutionLevel修改为:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

完整可运行代码示例

using System;
using System.Diagnostics;
using System.IO;

class P2Formatter
{
    static void Main(string[] args)
    {
        string driveLetter = "E";
        try
        {
            string serialNumber = GetDriveSerial(driveLetter);
            
            var startInfo = new ProcessStartInfo
            {
                FileName = @"C:\Windows\System32\P2FormatApp.exe", // 替换为实际路径
                Arguments = $"/fs:FAT /v:{serialNumber} /q {driveLetter}:",
                UseShellExecute = false,
                CreateNoWindow = true,
                RedirectStandardOutput = true,
                RedirectStandardInput = true,
                WorkingDirectory = Path.GetDirectoryName(@"C:\Windows\System32\P2FormatApp.exe")
            };

            using (var p = Process.Start(startInfo))
            {
                p.StandardInput?.Write("\r\n"); // 模拟确认操作(如果程序需要的话)
                p.WaitForExit();
                Console.WriteLine("格式化完成");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"错误:{ex.Message}");
        }
    }

    private static string GetDriveSerial(string driveLetter)
    {
        var drivePath = driveLetter.EndsWith(":") ? driveLetter : $"{driveLetter}:";
        var drive = new DriveInfo(drivePath);
        return drive.SerialNumber.ToString("X").ToUpper();
    }
}

内容的提问来源于stack exchange,提问作者coleh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:23:10