Formatage clé USB [Résolu]

Signaler
Messages postés
10
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
4 août 2011
-
eltonCosmo
Messages postés
10
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
4 août 2011
-
Bonjour,

Je suis débutant en c# et je souhaiterais que mon programme formate ma clé avant de copier des données dessus. J'arrive à gérer la copie, mais je ne trouve pas de méthode permettant de formater la clé...

Merci pour votre aide, cordialement.

11 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
31
Si tu utilises ma méthode (avec Process.Start()), voici une technique qui devrait marcher (je n'ai pas testé directement cette commande, car je tiens à mes données).

Tout d'abord, importe cette méthode :
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);


Ensuite, lance ton process, en redirigeant la sortie :
Process p = new Process();
p.StartInfo.FileName = "format";
p.StartInfo.Arguments = // ... Je te laisse mettre tes arguments
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.Start();


Après, tu attends qu'il te pose la question du formatage :
string s;
do
{
    Thread.Sleep(10);
    s = p.StandardOutput.ReadLine();
}
while (s != "Lancer le formatage (O/N)?");
// Vérifie que la question est bien celle-ci, au caractère près.


Enfin, tu simules l'appui sur la touche O dans cette fenêtre :
IntPtr ptr = p.MainWindowHandle;
ShowWindow(ptr, 1);
SendKeys.SendWait("O");
p.WaitForExit();


En revanche, comme tu t'en doutes, cette méthode peut aboutir à des abus. Sois prudent avec ça, car si tu l'utilises contre le gré d'une personne, tu risques gros.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
10
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
4 août 2011

Merci krimog pour ta réponse ton code fonctionne à condition de mettre p.StartInfo.UseShellExecute à true.

il existe également l'argument /y qui permet d'enlever l'étape de validation par l'utilisateur
            //Utilisation de la class ProcessStartInfo
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.CreateNoWindow = false;
            startInfo.UseShellExecute = true;
            startInfo.FileName = "format";
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.Arguments = myIni.GetValue("CléUSB","cheminClé") + " " +"/q"  + " " + "/y";

            try
            {
                // Démarrez le processus avec les infos que nous avons spécifié.
                using (Process exeProcess = Process.Start(startInfo))
                {
                    exeProcess.WaitForExit();
                }
            }
            catch
            {
                MessageBox.Show("ERREUR");                // Log error.
            }
 
Messages postés
14620
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
19 janvier 2020
138
Bonjour,

Une clé est considérée comme un support de stockage :
http://www.google.fr/...

Mon site
Messages postés
10
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
4 août 2011

merci je vais chercher un peu dans ce sens
Messages postés
10
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
4 août 2011

dsl après recherche sur google je n'ai toujours pas trouver de solution...
Tu n'aurais pas une méthode ou un morceau de code pour m'expliquer un peu plus clairement ?
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
31
Salut

Le plus simple est d'utiliser la commande format (plus d'infos ici).

Pour exécuter cette commande, regarde du côté de
System.Diagnostics.Process.Start(ligneDeCommande);


Cette méthode statique te renvoie un objet de type Process, et tu peux alors utiliser la méthode WaitForExit() pour que ton programme attende que le formatage soit terminé.

Lien MSDN

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
10
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
4 août 2011

Finallement j'ai réussi à créer une méthode qui appelle l'utilitaire de formatage de disque windows. dans mon code j'ai ça :

       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,
        }

        public const uint SHFMT_ERROR = 0xFFFFFFFF;
        public const uint SHFMT_CANCEL = 0xFFFFFFFE;
        public const uint SHFMT_NOFORMAT = 0xFFFFFFD;

        [DllImport("shell32.dll")]

        static extern uint SHFormatDrive(IntPtr hwnd, uint drive, uint fmtID,
   uint options);


        /// <summary>
        /// Permit to check the result of the format call
        /// Throw Exception with a detailed message
        /// </summary>
        /// 


        public static void CheckFormatResult(uint shFormatResult)
        {
            if (shFormatResult == SHFMT_ERROR)
                throw new Exception("An error occurred during the format. This does not indicate that the drive is unformattable.");
            if (shFormatResult == SHFMT_CANCEL)
                throw new OperationCanceledException("The format was canceled.");
            if (shFormatResult == SHFMT_NOFORMAT)
                throw new IOException("The drive cannot be formatted.");

            //we can exit normally
            return;
        }
      
        public void formatUSB()
        {      
            uint result = SHFormatDrive(this.Handle,
                  4, // formatting E:
                  (uint)SHFormatFlags.SHFMT_ID_DEFAULT,
                  0); // full format of E:
            if (result == (uint)SHFormatFlags.SHFMT_ERROR)
                MessageBox.Show("Unable to format the drive");
        }
    }


Voilà mais j'aimerais que le formatage soit automatisé, cad que l'utilisateur n'est rien à faire pour formater sa clé, donc si quelqu'un a une solution...
Messages postés
10
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
4 août 2011

@krimog :

L'utilisation de la commande format serait idéal pour mon projet mais lors de son éxecution il faut appuyer sur entrée pour valider le formatage, et je ne sait pas comment faire ça en c#..
Messages postés
14711
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 janvier 2020
90
Hello,
Je m'immisce dans la conversation. Du point de vue utilisateur, il vaut mieux lui laisser une étape de validation avant toute action "à risque", genre notamment le formatage. De plus, pourquoi vouloir formater à chaque fois que tu copies quelque chose?


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
10
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
4 août 2011

Je veux formater la clé après chaque copie car il s'agit de données sensibles et je souhaite automatiser au maximum mon programme donc enlever les étapes de validations.
Messages postés
14620
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
19 janvier 2020
138
Bonjour,

Au sujet de ta méthode (de manière générale) :
- Une Clé USB est la majorité du temps un lecteur Flash, un support limité en nombre d'écriture, donc ce n'est pas forcément une bonne idée
- Une autre solution est d'ouvrir les fichier et de réécrire les données, cela masque les données en limitant l'épuisement du lecteur.
- Très souvent les firmwares des clés essayent en général de réduire l'usure des supports et donc déplacent les données écrites
- Il me semble avoir lu il y a quelques temps que sur un DD, il est possible de rendre irrécupérable les données, mais sur un support Flash, c'est moins souvent le cas.

Donc si tes données sont sensibles, évites les supports Flash, mais préfère un support de type DD ou disquette.

Mon site