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

C++Builder Discussion :

TSHFILEOpstruct et UnicodeString avec XE2


Sujet :

C++Builder

  1. #1
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    481
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 481
    Par d�faut TSHFILEOpstruct et UnicodeString avec XE2
    Bonjour,
    j'ai utilis�, dans des versions pr�c�dentes de C++ Builder, la structure TSHFIlieOpstruct pour copier des fichiers.

    Je voudrais utiliser cette structure pour effacer des fichiers, afin d'�viter une destruction irr�m�diable des fichiers (errare humanum est).

    Je ne parviens pas � utiliser le nom du fichier usNomFichier, qui est un UnicoideString, pour l'affecter � pFrom qui demande un PChar ou un
    wchar_t*.

    J'ai cherch� dans la FAQ C++Builder, ainsi que dans celle de Delphi.

    Quelqu'un connait-il le rem�de ?

    Merci.

  2. #2
    R�dacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par d�faut
    Salut Pasqualini

    Un lien qui parle de ton probleme


  3. #3
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 096
    Par d�faut
    Un code pouvant t'inspirer !

    pFrom doit contenir 4 z�ros � la fin, 2 pour la fin de chaine Unicode, 2 autres pour la fin de tableau de chaine

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    void TCensure::DeleteTemporaryFiles()
    {
      TFileName TempPath = GetTemporaryPath();
     
      if ( ! TempPath.IsEmpty())
      {
        TFileName TempMask = TempPath + "*.*";
     
        int Len = TempMask.Length();
        int Size = Len + 1; // +1 pour le caractère zéro terminal de chaine
     
        wchar_t* pFormArray = new wchar_t[Size + 1]; // +1 pour le caractère zéro terminal de tableau de chaine
        try
        {
          StrCopy(pFormArray, TempMask.c_str());
          pFormArray[Size] = 0; // Indique la fin du tableau de chaine
     
          SHFILEOPSTRUCTW DeleteCriteria;
          ZeroMemory(&DeleteCriteria, sizeof(DeleteCriteria));
          DeleteCriteria.wFunc = FO_DELETE;
          DeleteCriteria.pFrom = pFormArray;
          DeleteCriteria.fFlags = FOF_FILESONLY | FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI;
     
          SHFileOperationW(&DeleteCriteria);
        }
        __finally
        {
          delete [] pFormArray;
        }
      }
    }
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    481
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 481
    Par d�faut
    Merci,
    voil�, ce que j'ai tent� :
    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
    18
    19
    20
    UnicodeString usNom = eRepertoire->Text + eNomFichier->Text;
      int Size = usNom.Length();
      wchar_t* wcFrom = new wchar_t[Size + 1];
      StrCopy(wcFrom, usNom.c_str());
      wcFrom[Size] = 0;
      SHFILEOPSTRUCTW ShOps;
      ZeroMemory(&ShOps, sizeof(ShOps));
      try
      {
    	ShOps.hwnd = Application->Handle;
    	ShOps.wFunc = FO_DELETE;
    	ShOps.pFrom = wcFrom;
    	ShOps.fFlags = FOF_FILESONLY | FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI;
    	SHFileOperationW(&ShOps);
      }
     
      __finally
      {
    	delete [] wcFrom;
      }
    Le fichier n'est pas effac�.
    Qu'y a-t-il de faux ?

  5. #5
    Membre �m�rite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par d�faut
    Hello,

    Les fonctions de l'API Windows ont un code de retour, celui de SHFileOperation devrait te donner un indice (cf. MSDN)

    Sinon, il y a bien un "\" � la fin de eRepertoire->Text ou au d�but de eNomFichier->Text ??

  6. #6
    R�dacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738

  7. #7
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    481
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 481
    Par d�faut
    La fonction SHFileOperationW retouren un code d'erreur 2. C'est-�-dire "Fichier non trouv�".

    Pour r�pondre � la question de totoche76: il y a bien un "\" � la fin de eRepertoire->Text et il n'y en pas, ,�videmment, � la fin du nom de fichier.

    Les exemples donn�s choisissent toujours le nom du fichier sous forme explicite tel que FileOpStr.pFrom = "C:\\Source\0". je n'ai pas trouv� d'exemple lorsque le pFrom est engendr� � partir d'un UnicodeString.

  8. #8
    Membre �m�rite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par d�faut
    Hello,

    ShaiLeTroll t'a donn� la bonne explication, mais pas le bon code...

    SHFILEOPSTRUCTW.pFrom contient une liste de chemins. Chaque chemin est termin� par un 0, et un 0 final (encore en plus en plus) termine la liste.
    Donc pFrom contient: "Chemin1\0Chemin2\0\0"
    Ou pour un seul chemin: "Chemin1\0\0"

    Quand tu alloues pour Size+1, tu n'obtiens que le 1er 0 terminal....

    Donc:
    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
    18
    19
    UnicodeString usNom = eRepertoire->Text + eNomFichier->Text;
      int Size = usNom.Length();
      wchar_t* wcFrom = new wchar_t[Size + 2];
      StrCopy(wcFrom, usNom.c_str());
      wcFrom[Size+1] = 0;
      SHFILEOPSTRUCTW ShOps;
      ZeroMemory(&ShOps, sizeof(ShOps));
      try
      {
        ShOps.hwnd = Application->Handle;
        ShOps.wFunc = FO_DELETE;
        ShOps.pFrom = wcFrom;
        ShOps.fFlags = FOF_FILESONLY; // | FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI;
        SHFileOperationW(&ShOps);
      }
      __finally
      {
    	delete [] wcFrom;
      }

  9. #9
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    481
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 481
    Par d�faut
    Un grand merci.
    Cela fonctionne enfin.

    J'avais essayer
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    wchar_t* wcFrom = new wchar_t[Size + 2];
    mais j'avis essay� d'ajout� 2 z�ros et cela ne fonctionnait pas du tout.

  10. #10
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    481
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 481
    Par d�faut
    Je corrige mes fautes d'orthographe :
    Un grand merci.
    Cela fonctionne enfin.

    J'avais essay�
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    wchar_t* wcFrom = new wchar_t[Size + 2];
    mais j'avais essay� d'ajouter 2 z�ros et cela ne fonctionnait pas du tout.

  11. #11
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 096
    Par d�faut
    Citation Envoy� par totoche76 Voir le message
    ShaiLeTroll t'a donn� la bonne explication, mais pas le bon code...

    Si si j'ai donn� le BON code et comment� de surcroit (directement issu d'un de mes projets), il a juste �t� mal recopi� !

    MON CODE
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
        int Len = TempMask.Length();
        int Size = Len + 1; // +1 pour le caractère zéro terminal de chaine
     
        wchar_t* pFormArray = new wchar_t[Size + 1]; // +1 pour le caractère zéro terminal de tableau de chaine
    la version mal recopi�e
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    UnicodeString usNom = eRepertoire->Text + eNomFichier->Text;
      int Size = usNom.Length();
      wchar_t* wcFrom = new wchar_t[Size + 1];
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre �m�rite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par d�faut
    Ah ouaih tiens ! D�sol� !

  13. #13
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    481
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 481
    Par d�faut
    C'est vrai et j'en ai honte !

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 5
    Dernier message: 11/05/2012, 17h49
  2. chemins de projets et unit� avec XE2
    Par Pascal Fonteneau dans le forum EDI
    R�ponses: 5
    Dernier message: 16/04/2012, 18h50
  3. Des applications qui ont de la gueule avec XE2
    Par Guyt54 dans le forum C++Builder
    R�ponses: 18
    Dernier message: 14/04/2012, 20h15
  4. Probl�me �v�nement TIdUDPServer avec XE2
    Par Guyt54 dans le forum C++Builder
    R�ponses: 1
    Dernier message: 04/04/2012, 18h20
  5. Probl�me EmbeddedWB avec XE2
    Par Teddy dans le forum D�buter
    R�ponses: 10
    Dernier message: 28/12/2011, 18h43

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