Как программно отформатировать SD-карту с FAT16? - PullRequest
3 голосов
/ 05 августа 2009

Я хотел бы инициализировать SD-карту с файловой системой FAT16. Предполагая, что у меня есть устройство чтения SD на диске G: как я могу легко отформатировать его в FAT16?

UPDATE: Чтобы уточнить, я хотел бы сделать это на платформе .net с использованием C # таким образом, чтобы я мог обнаруживать ошибки и работал бы в Windows XP и выше.

Ответы [ 5 ]

3 голосов
/ 29 сентября 2009

Я попробовал ответы выше, к сожалению, это было не так просто, как кажется ...

Первый ответ с использованием объекта управления выглядит как правильный способ, но, к сожалению, метод «Формат» не поддерживается в 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();

    }
}
3 голосов
/ 05 августа 2009

Вы можете использовать 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" );
1 голос
/ 05 августа 2009

Существует множество ответов здесь

Метод 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});

У меня нет запасного диска для тестирования, поэтому размер кластера может быть неправильным.

См. здесь для получения дополнительной информации.

1 голос
/ 05 августа 2009

Предполагая, что вы на самом деле спрашиваете, как это сделать в C # (из тега, который вы применили к вопросу):

Я не верю, что существует каркасный способ форматирования диска, поэтому вам, возможно, придется прибегнуть к чему-то вроде

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

Тем не менее, это довольно хрупкий способ сделать это, и без разбора выходных данных вы не сможете определить, было ли это успешным. В целом я буду осторожен и спросить себя, действительно ли вы хотите разрешить формат из своего приложения.

1 голос
/ 05 августа 2009

Не удалось найти функцию в DriveInfo и др., Но вы всегда можете использовать (создать) командный файл, содержащий Format G: /FS:FAT, и запустить его с System.Diagnostics.Process

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...