IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VC++ .NET Discussion :

copy de dossier via structure SHFILEOPSTRUCTA (fichier corompu apres redémarage)


Sujet :

VC++ .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut copy de dossier via structure SHFILEOPSTRUCTA (fichier corompu apres redémarage)
    Bonjour,

    je travail sur un pc gaming (Quixant), celui-ci est utilisé dans les jeux forain/casino car il peut être éteint en coupant directement sont alimentation. (pratique dans les boutiques car au soir power off via disjoncteur générale).

    afin de faire un bootloader (mis ajour) via une clé usb, j'utilise la structure SHFILEOPSTRUCTA pour copier des fichier.

    mon application se lance donc automatiquement a l'allumage du pc.
    si elle detecte une clé usb (à l'allumage, power on) avec le bon dossier , elle enclenche la procédure de mis a jour:

    la mise a jour contient un dossier media_new et un fichier application_new.exe qui remplaceront le fichier application.exe en cours de fonctionnement et du dossier media

    1) copie du fichier application_new.exe et du dossier media_new de la clé usb sur le disque
    2) renommage fichier application.exe en application_old.exe et du dossier media en media_old
    3) renommage fichier application_new.exe en application.exe et du dossier media_new en media
    4) suppression du fichier application_old.exe et du dossier media_old
    5) exit du programme
    6) power off de la machine - retirer la clé usb (sinon le boottload redémarre) et power on apres 1 minutes de pause.

    LE PROBLEME: avec certaine clé usb au redémarrage power on apres un boottload, un ou plusieurs fichiers sont parfois corrompu (image .png) et plante toute l’application.

    si je n'effectue pas de power on, je clique directement sur le fichier.exe apres le bootload pour relancer l'application je n'ai jamais ce problème.

    je quitte pourtant le programme afin de bien libérer toute les ressources au cas ou j'en aurais oublier une mais !!!

    avez vous une idée ?

    un bout de code pour expliquer la copier des fichiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    SHFILEOPSTRUCTA sh;
    bool error = false;
     
    //copy media
    sh.hwnd = NULL;
    sh.wFunc = FO_COPY;
    sh.pFrom = usbKeyFolderMediaPath00;
    sh.pTo = applicationFolderPath00;
    sh.fFlags = NULL;
    sh.fAnyOperationsAborted = false;
    sh.hNameMappings = NULL;
    sh.lpszProgressTitle = NULL;
     
    if (SHFileOperationA(&sh) != 0) {
    MessageBox(NULL, L"bootload downloading error 1", NULL, NULL);
    }

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    J'arrive plus d'un an après la bataille.

    Pour ceux qui tentent de faire la même chose.

    Déjà, moi, je me ferais pas chier à réinventer une roue carrée en implémentant un n-ième installateur, mais en utilisant celui qui est déjà intégré à Windows qui fait grave le taf : Windows Installer.
    En résumé, vous créez un fichier MSI avec toutes les instructions/cas de figure qui vous intéressent :
    - Installation différente en fonction de l'OS
    - Installation en fonction de ce qui est déjà installé
    - Installation silencieuse
    - Installation administrative
    - Gestion des Patchs
    - Gestion des Rollback
    - Gestion des dépendances
    - etc...

    Le nombre de fonctionnalités offertes par Windows Installer, c'est COLOSSAL !!!

    Je ne sais pas comment fonctionne les PC "Quixant" mais s'ils n'utilisent pas d'UPS et/ou ne tweakent pas le kernel Windows pour ne pas utiliser de cache d'entrée/sortie sur les systèmes de fichiers (ou faire une purge de ces cache avant la "fin"), c'est normal que vous ayez ce type d'emmerdes.
    Je pense que cela n'a pas avoir avec les clés USB. (Sauf que les plus lentes sont plus susceptibles avoir le "problème")

    Voici mon hypothèse : quand vous avez des fichiers qui ont été corrompus, c'est très vraisemblablement parce que les caches d'entrée/sortie du système de fichier n'ont pas été vidés "correctement" avant le "shutdown" du système.

    Sauf en utilisant des options particulières d'ouverture de fichier, toutes les actions sur des fichiers sont "bufferisées/anticipées/mis en cache" pour ne pas attendre des plombent les disques durs (je sais pas si c'est la même chose sur les SSD).

    >si je n'effectue pas de power on, je clique directement sur le fichier.exe apres le bootload pour relancer l'application je n'ai jamais ce problème.

    Bin oui, parce qu'en faisant ça, vous passez par le Kernel qui utilise ses caches d'entrée/sortie.

    >je quitte pourtant le programme afin de bien libérer toute les ressources au cas ou j'en aurais oublier une mais !!!
    Oui, c'est bien, votre programme n'a plus de ressources, mais le Kernel, lui a les siennes : les caches d'entrée/sortie.

    Donc, je ne vois rien dans votre approche pour contrecarrer ce problème de caches d'entrée/sortie.

    Mais comme je l'ai indiqué, moi, j'utiliserais Windows Installer qui utilise des primitives spécifiques pour éviter ces problèmes.
    Je ne vois pas dans les options de "SHFileOperationA" d'options pour désactiver les caches comme le ferait CreateFile (FILE_FLAG_NO_BUFFERING).

    >SHFileOperationA
    Et pourquoi la version ASCII ??? et pas la version "T" ?

    Vous utilisez la version "T" de MessageBox, mais avec des paramètres "WIDE", donc vous compilez en "UNICODE = 1".
    Vous devriez toujours utiliser les versions "T", sauf pour compatibilité avec des données "externes".

Discussions similaires

  1. [XL-2003] Copie d'info via des dossier word
    Par NoobProg dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/07/2011, 11h33
  2. Lecture/écriture fichier binaire via structure
    Par Tenebrous dans le forum C
    Réponses: 9
    Dernier message: 07/03/2010, 00h02
  3. Réponses: 2
    Dernier message: 28/11/2007, 21h02
  4. Réponses: 3
    Dernier message: 23/11/2006, 00h29
  5. Réponses: 2
    Dernier message: 14/03/2006, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo