none
détecter automatiquement les fichier défectueux (C#) RRS feed

  • Question

  • J'ai effectué une récupérations de fichiers supprimés et j'en ai obtenu plusieurs milliers dont certains ne fonctionne pas forcement. Alors avant de les rendre je dois effectué un tri concis qui séparera le bon grain du mauvais.

    La première idée qui qui m'est venu c'est de faire un logiciel qui va ouvrir chaque fichier dans son application par défaut et écouter les erreurs pendant un certain temps si on en trouve. Si il n'y a pas d'erreur on récupère le fichier avant de tuer le processus créé pour éviter qu'une boite de dialogue n’empêche la fermeture.

    Le problème sue je rencontre est que à priori je ne peux pas utiliser le SHELL pour l'ouverture des fichiers et écouter la sortie d'erreur en même temps. Alors j'ai penser à ouvrir d'abord le fichier à base du SHELL, récupérer le module qui à servir à ouvrir ce fichier pour ensuite le fermer et ouvrir le même fichier sans le SHELL et écouter les erreurs. Mais il y a toujours des erreurs. Voila la procédure que j'utilise pour tester chaque fichier. La ligne 11 génère une erreur et on me qu'aucun processus n'est associé à ce type de fichiers. j'aimerais comprendre ce qui ne vas pas et si quelqu'un peut me trouver une solution même tout autre, elle serait la bienvenue.

    bool TestFile(String filename) { bool b = false; ProcessStartInfo Starter = new ProcessStartInfo(filename); Starter.CreateNoWindow = false; Starter.ErrorDialog = false; Process Tester1 = new Process() { StartInfo = Starter }; Tester1.Start(); Starter.UseShellExecute = false; Starter.RedirectStandardError = true;

    Starter.FileName = Tester1.MainModule.FileName; Starter.Arguments = filename; Tester1.Kill(); Process Tester = Process.Start(Starter); Starter.UseShellExecute = false; Starter.RedirectStandardError = true; StreamReader ErrorReader = Tester.StandardError; Tester.BeginErrorReadLine(); DateTime OpenTime = DateTime.Now; while (Tester.StandardError == null) { if (OpenTime + TimeSpan.FromSeconds(30) == DateTime.Now) { b = true; break; } } Tester.Kill(); return b; ]

    Pour info, je fonctionne sous Windows 8 et j'utilise Visual Studio 2013.

    mardi 17 juin 2014 09:35

Réponses

  • Effectivement, c'est délicat et lourd...

    Je pensais au début que tu avais un programme unique qui pouvait vérifier cela. Si effectivement il n'y a que les applications concernées qui peuvent le faire c'est doublement lourd car :

    - Le PC doit avoir toutes les applications concernées installées
    - Chaque ouverture d'un programme externe est coûteuse.

    S'il n'y a pas d'autre moyen que d'ouvrir avec l'application concernée, c'est impossible alors...

    Si tu as des fichiers autocad, ou word ou tutifruti, on n'est pas sorti de l'auberge... Chaque application a une manière spécifique d'enregistrer ses données. Donc traiter tous les cas c'est impossible car ça prendrait énormément de temps à faire (dans ce cas autant les vérifier à la main) et ça peut changer avec les versions en plus...


    Philippe

    mardi 17 juin 2014 14:53

Toutes les réponses

  • Bonjour,

    Quel est le nom de fichier récupéré? Si ce n'est pas un fichier exécutable, c'est normal que tu aies cette erreur. Si effectivement ce n'est pas un fichier exécutable, la question est alors : quel est le fichier exécutable qui gère le type de fichier que tu viens de récupérer...


    Philippe

    mardi 17 juin 2014 12:47
  • En fait il y a plusieurs types différents de fichiers et on parle de plus de 200 000 fichiers.

    mardi 17 juin 2014 12:54
  • J'avais bien compris mais le problème est que ProcessStartInfo.FileName est censé être un fichier exécutable et non pas un fichier d'un type quelconque. Il faut mettre à la place le chemin complet de l'exécutable qui est censé ouvrir chaque fichier.

    D'après ce que je vois, tu croyais récupérer l'exécutable lancé mais tu as peut-être récupéré le fichier examiné.

    Quel est donc le fichier exécutable qui est censé ouvrir ces fichiers?


    Philippe

    mardi 17 juin 2014 13:02
  • Ok je vois mais en fait c'est un bon melange de fichier word, excel, autocad, PDF, images, compressé et autres

    Donc j'aurais bien voulu que l'application reconnaisse automatiquement l'exécutable correspondant au fichiers.

    j'aimerais bien faire un switch mais ce lourd de charger toutes ces extensions sans en oublié.

     
    mardi 17 juin 2014 14:23
  • Effectivement, c'est délicat et lourd...

    Je pensais au début que tu avais un programme unique qui pouvait vérifier cela. Si effectivement il n'y a que les applications concernées qui peuvent le faire c'est doublement lourd car :

    - Le PC doit avoir toutes les applications concernées installées
    - Chaque ouverture d'un programme externe est coûteuse.

    S'il n'y a pas d'autre moyen que d'ouvrir avec l'application concernée, c'est impossible alors...

    Si tu as des fichiers autocad, ou word ou tutifruti, on n'est pas sorti de l'auberge... Chaque application a une manière spécifique d'enregistrer ses données. Donc traiter tous les cas c'est impossible car ça prendrait énormément de temps à faire (dans ce cas autant les vérifier à la main) et ça peut changer avec les versions en plus...


    Philippe

    mardi 17 juin 2014 14:53
  • Vu juste je suis arrivé à cette même conclusion au départ mais étant donné qu'on ne peut pas tout connaitre, j'ai décidé de poser la question. La solution intermédiaire que j'ai trouver est de faire un switch sur les extensions de fichiers que je maîtrise (Word, Excel, PDF et consort) Sa va réduire considérablement le nombre de fichiers (pour environ 90%) pour ainsi faciliter le travail manuel.

    Merci pour ton intervention.

    mardi 17 juin 2014 15:19