2010-07-13 7 views
5

Quiero formatear (FAT32) unidad extraíble con programación C#. En Internet encontré la manera, pero el problema es que abre el programa genérico de formato de Windows. Pero quiero hacerlo solo con C# y sin compatibilidad integrada con Windows.Formato Medios extraíbles con programación C#

Mi método es:

// FAT32 Format Button click event 
[DllImport("shell32.dll")] 
static extern uint SHFormatDrive(IntPtr hwnd, uint drive, uint fmtID, uint options); 
+0

entonces supongo que tendrá que aprender cómo implementar por sí mismo. –

+5

No lo escriba usted mismo. Tu no sabes como Si está haciendo esta pregunta aquí, _definitivamente_ no sé cómo. Y el hecho de que estés incluso tentado a reimplantar esto grita que realmente no tienes una buena razón para hacerlo, y que hagas lo que hagas será malo, roto e incorrecto. –

Respuesta

4

Puede utilizar wmi, no es un método que permite esto.

http://msdn.microsoft.com/en-us/library/aa390432%28v=VS.85%29.aspx

+0

Aunque eso no es algo en el lenguaje C#. Es .NET CLR y sospecho que es específico de Windows. Pero si todo lo que Rafayan quiere es una llamada administrada, entonces esa es una solución (un recurso pesado al llamar a WMI en lugar de simplemente llamar a una interoperabilidad). – tjmoore

1

No creo que haya nada en C# que genéricamente no conducir el formato, de cualquier formato. El método que tiene es probablemente la mejor manera de hacerlo en Windows.

Si lo quiere realmente genérico, todavía necesitará algún método específico de plataforma para obtener acceso al hardware para hacer el trabajo. C# solo le proporcionará la funcionalidad de E/S estándar.

Puedes buscar bibliotecas de terceros que sean multiplataforma si eso es lo que realmente buscas. Lo más probable es que la solución que tiene funcione en otras plataformas de todos modos (por ejemplo, mono), aunque no sé mucho sobre ellos.

0

SHFormatDrive es un contenedor de alto nivel para una API llamada DeviceIoCtl, que se utiliza en el nivel del controlador para hacer cosas como unidades de formato. No podrá omitir el diálogo, ya que obviamente está diseñado como un método de shell que incorpora una GUI.

No sé qué fuera de realidad p/invoke'ng DeviceIoCtl que podría usar aquí. Mark Russinovich (de la fama de SysInternals) solía tener una utilidad llamada "FormatX" que haría en NT4 lo que hace DeviceIOCtl en versiones posteriores, pero parece que se ha dictado, fuente y todo. Creo que la otra mejor opción es crear un proceso de shell de comandos separado que llame a la utilidad format con los parámetros correctos. Simplemente abra una consola y escriba format /? para tener una idea. Por supuesto, puede usar System.Diagnostics.Process para hacer esto con el intérprete de comandos (con cmd.exe /c).

0

funciona bastante bien a través de WMI:

var query = String.Format("SELECT * FROM Win32_Volume WHERE Name = '{0}'", "E:\\\\"); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", query); 
var queryCollection = from ManagementObject x in searcher.Get() select x; 
var volume = queryCollection.FirstOrDefault(); 

var resultCode = volume.InvokeMethod("Format", new object[] { "FAT32", true, 4096, "Volume Name", false });