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 confirm�
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    D�tails du profil
    Informations personnelles :
    �ge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    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