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 :

Copie du contenu d'un dossier


Sujet :

C++Builder

  1. #1
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut Copie du contenu d'un dossier
    Bonjour à tous

    Je cherche à copier le contenu d'un dossier (présent sur un APN) dans un dossier local.

    Voulant éviter les problèmes avec les APN qui possèdent une gestion parfois un peu particulière des fichiers, j'ai donc décidé de mettre en place une méthode me permettant de copier fichiers et dossiers et de reconstruire l'arborescence à l'identique dans le dossier local.

    Au début, j'ai cherché à faire ça par moi-même (à l'aide des fonctions FindFirst, FindNext et le reste de la famille ) mais ce ne fut pas une grande réussite

    J'ai donc fait un petit tour sur le forum et je suis tombé sur ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SHFILEOPSTRUCT FileOpStr;
    ZeroMemory(&FileOpStr, sizeof(FileOpStr));
    FileOpStr.hwnd = Application->Handle;
    FileOpStr.wFunc = FO_COPY;
    FileOpStr.pFrom = "C:\\Source\0";
    FileOpStr.pTo = "C:\\Destination\\*.*\0";
    SHFileOperation(&FileOpStr);
    Hélas, impossible de le faire fonctionner
    A chaque exécution, j'ai droit à une erreur Impossible de lire à partir du fichier source ou de la disquette...

    Si quelqu'un a une solution, je suis preneur

    Nb : je tourne sous Windows 2000 avec les droits administrateurs sur mon compte. Je ne pense donc pas que le problème vienne des droits sur les dossiers.
    + + +

  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
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut bakaneko
    Super cette fonction elle marche tres bien apres juste une petite modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    SHFILEOPSTRUCT FileOpStr;
    ZeroMemory(&FileOpStr, sizeof(FileOpStr));
    FileOpStr.hwnd = NULL;
    FileOpStr.wFunc = FO_COPY;
    FileOpStr.pFrom = "C:\\Documents and Settings\\blondelle\\Mes documents\\ADO_DOC\0"; // C:\Documents and Settings\blondelle\Mes documents\ADO_DOC
    FileOpStr.pTo = "C:\\Documents and Settings\\blondelle\\Mes documents\\Nouveau dossier (4)copie\0";
    SHFileOperation(&FileOpStr);
    }
    Dans ton code
    FileOpStr.pTo = "C:\\Destination\\*.*\0";
    remplacer par
    FileOpStr.pTo = "C:\\Destination\0";
    j'ai vu un autre code et j'ai remarque que " *.extension " etait utilise pour copier les fichiers avec une extension donnee, pour la copie complete on ne met rien.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  3. #3
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    C'est vrai que ça marche mieux ainsi

    Merci pour le coup de main

    Nb : Il faudra corriger l'exemple ou ajouter une précision pour que ce genre d'erreurs ne se reproduisent pas
    + + +

  4. #4
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Je pense que c'est surtout l'explication qui doit etre corrigee, la fonction a ete mise complete, si on fait une copie complete on ne met rien sinon on met une extension *.txt, *.exe .... pour le type de fichier que l'on veut copier
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  5. #5
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    Le seul soucis que je rencontre maintenant, c'est que je voulais copier le contenu du dossier source et non pas le dossier source (je me retrouve donc avec un niveau de plus dans mon arborescence ).
    Ce n'est pas critique mais si quelqu'un possède une solution
    + + +

  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
    Points : 3 766
    Points
    3 766
    Par défaut
    Si ton dossier est compose de plusieurs sous dossiers, par exemple pour copier deux sous dossiers ( la seule partie qui change )
    FileOpStr.pFrom = "C:\\Documents and Settings\\blondelle\\Mes documents\\ADO_DOC\\ADODelphi\0C:\\Documents and Settings\\blondelle\\Mes documents\\ADO_DOC\\ADODelphi1\0\0";
    Il faut ecrire deux fois la chaine, la separation entre les chaines est " \0 ", et la terminaison est " \0\0 "
    en esperant etre clair
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  7. #7
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    Vue que mon but était de copier tout le contenu du répertoire sans avoir à devoir le scruter pour trouver les sous-répertoires, ce n'est pas totalement la solution que je cherchais

    Donc je continues mes recherches...
    + + +

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Désolé mais il n'y a pas d'autre solution qu'énumérer toi-même le répertoire en question pour obtenir la liste de son contenu, puis de lancer SHFileOperation.
    Soit pour chaque élément, soit pour l'ensembe des éléments (en les concaténant).

    Le principe est le suivant:
    1/ Enumération du répertoire (par ex avec FindFirstFile, FindNextFile), stockage des élements dans une liste (TStringList)
    2/ Calcul de la longueur des éléments (y compris \0 terminal) + un 2nd \0 terminal en toute fin de chaine (chaine à double terminaison)
    3/ allocation de la chaine nécessaire (char*)
    4/ remplissage
    5/ SHFileOpearation
    6/ libération

    Yarp
    www.senosoft.com

  9. #9
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    Donc je reviens à ce que j'avais prévu de faire à l'origine et que je voulais éviter...

    Merci à vous deux
    + + +

  10. #10
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Pour conserver la meme arborescence sur un autre disque ici le disque D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    SHFILEOPSTRUCT FileOpStr;
    ZeroMemory(&FileOpStr, sizeof(FileOpStr));
    FileOpStr.hwnd = Application->Handle;
    FileOpStr.wFunc = FO_COPY;
    FileOpStr.pFrom = "C:\\Documents and Settings\\blondelle\\Mes documents\\ADO_DOC\0";
    FileOpStr.pTo = "D:\\\0";
    SHFileOperation(&FileOpStr);
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  11. #11
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    J'ai essayé de refaire ce que j'ai désiré en couplant le code corrigé par blondelle et la structure de la fonction récursive que je voulais mettre en place. Il s'avère que j'ai réussi à faire la fonction récursive que je désirais sans le remarquer

    J'obtiens donc ceci :

    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
    32
    33
    34
    35
    36
    37
    38
    39
     
    void GR_FileCopy(AnsiString aSourceDir,AnsiString aDestDir)
    {
     TSearchRec FileInfo;
     
     if (!FindFirst((aSourceDir+"\\*.*"),faAnyFile,FileInfo))//si on a trouvé un fichier dans le répertoire désiré
     {
      do//faire
      {
       if ((FileInfo.Name.AnsiCompare(".") != 0)&&(FileInfo.Name.AnsiCompare("..") != 0))//élimination des dossiers . et ..
       {
        if ((FileInfo.Attr & faDirectory) != 0)//si le fichier trouvé est un dossier
        {
         AnsiString aSourceDirNext = aSourceDir + "\\";
         aSourceDirNext += FileInfo.Name;//nom du dossier source
         AnsiString aDestDirNext = aDestDir + "\\";
         aDestDirNext += FileInfo.Name;//nom du dossier cible
     
         CreateDirectory(aDestDirNext.c_str(),0);//création du répertoire cible
     
         GR_FileCopy(aSourceDirNext,aDestDirNext);//copie du dossier
        }
        else//sinon
        {
         AnsiString aSourceFile = aSourceDir + "\\";
         aSourceFile += FileInfo.Name; //fichier source
     
         AnsiString aDestFile = aDestDir + "\\";
         aDestFile += FileInfo.Name;//fichier cible
     
         CopyFile(aSourceFile.c_str(),aDestFile.c_str(),false);//copie du fichier
        }
       }
      }
      while(!FindNext(FileInfo));//tant que l'on trouve un fichier
     }
     
     FindClose(FileInfo);//destruction de la structure d'informations fichier
    }
    Merci pour le coup de main que vous m'avez donné
    + + +

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    slt, je sais que le dernier message date d'il y a 2ans mais ...

    j'aurai besoin d'aide pour faire à peu de chose près la même chose.
    Copier un dossier et son contenu depuis un PDA vers un PC en respectant l'arborescence.
    Par la suite je ferais la même chose dans le sens inverse PC->PDA.

    La partie copie de fichier n'est pas un obstacle, il me faudrai quelque explication sur l'algo utiliser pour gérer le premier chemin donner 'PATH' et le nouveau chemin à chaque fois que l'on rencontre un dossier 'newPATH'.

    voila "mon" code pas complet du tout :

    merci merci

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    #include <string.h>
    #include <rapi.h>
    #include <strsafe.h>
     
    #define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
     
    WCHAR wszDestDir[MAX_PATH];
    WCHAR wszSrcDir[MAX_PATH];
    WCHAR wszSrcFile[MAX_PATH];
    WCHAR wszDestFile[MAX_PATH];
    BYTE  Buffer[4096];
     
    int FileCopy(LPCWSTR wszSrcFile, LPCWSTR wszDestFile)
    {
    	HANDLE hSrc, hDest;
        DWORD dwNumRead, dwNumWritten;
     
    	hSrc = CeCreateFile(
                    wszSrcFile,
                    GENERIC_READ,
                    FILE_SHARE_READ,
                    NULL,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);
        if (INVALID_HANDLE_VALUE == hSrc)
        {
            _tprintf( TEXT("Unable to open Windows CE file"));
            return 1;
        }
     
        hDest = CreateFile(
                    wszDestFile,
                    GENERIC_WRITE,
                    FILE_SHARE_READ,
                    NULL,
                    CREATE_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);
     
        if (INVALID_HANDLE_VALUE == hDest)
        {
            _tprintf( TEXT("Unable to open host/destination file"));
            return 1;
        }
    #ifdef UNICODE
        wprintf( TEXT("Copying WCE:%s to %s\n"), wszSrcFile, wszDestFile);
    #else
        printf( TEXT("Copying WCE:%S to %s\n"), tszSrcFile, wszDestFile);
    #endif
     
        do
        {
            if (CeReadFile(
                    hSrc,
                    &Buffer,
                    sizeof(Buffer),
                    &dwNumRead,
                    NULL))
            {
                if (!WriteFile(
                        hDest,
                        &Buffer,
                        dwNumRead,
                        &dwNumWritten,
                        NULL))
                {
                    _tprintf( TEXT("Error !!! Writing hostfile"));
                    CeCloseHandle( hSrc);
    				CloseHandle (hDest);
                }
            }
            else
            {
                _tprintf( TEXT("Error !!! Reading Windows CE file"));
                CeCloseHandle( hSrc);
    			CloseHandle (hDest);
            }
            _tprintf( TEXT("."));                                        
        } while (dwNumRead);
        _tprintf( TEXT("\n"));
     
    	return 0;
     
    }
     
    int FoundFile(LPWSTR Path, LPWSTR destPath, UINT Indent)
    {
    	DWORD foundCount; // nombre de fichier trouver
    	LPCE_FIND_DATA findDataArray; // tableau de structure contenant les infos des fichiers
    	HRESULT hr;
     
    	if(!CeFindAllFiles(wszSrcDir, FAF_ATTRIBUTES | FAF_NAME, &foundCount, &findDataArray))
    	{
    		_tprintf( TEXT("*** CeFindAllFiles failed. ***\n"));
    		return 1;
    	}
     
    	if(!foundCount)
            return 1;
     
        for(UINT i = 0; i < foundCount; i++)
        {
            for(UINT indCount = 0; indCount < Indent; indCount++)
                _tprintf( TEXT("  "));
     
            if(findDataArray[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
    			//si c'est un dossier
                _tprintf( TEXT("[%s]\n"),findDataArray[i].cFileName);
                WCHAR newPath[MAX_PATH];
    			WCHAR newDest[MAX_PATH];
                hr = StringCchCopyW(newPath, ARRAYSIZE(newPath), Path);
                if(FAILED(hr))
                {
                    return 1;
                }
    			hr = StringCchCopyW(newDest, ARRAYSIZE(newDest), destPath);
                if(FAILED(hr))
                {return 1;}
     
                hr = StringCchCatW(newPath, ARRAYSIZE(newPath), findDataArray[i].cFileName);
                if(FAILED(hr))
                {
                    return 1;
                }            
                hr = StringCchCatW(newDest, ARRAYSIZE(newDest), findDataArray[i].cFileName);
                if(FAILED(hr))
                {return 1;}
     
                hr = StringCchCatW(newPath, ARRAYSIZE(newPath), L"\\");
                if(FAILED(hr))
                {
                    return 1;
                }
                hr = StringCchCatW(newDest, ARRAYSIZE(newDest), L"\\");
                if(FAILED(hr))
                {return 1;}
     
                FoundFile(newPath, newDest, Indent + 1);
            }
            else
            {	
    			//si non
                _tprintf( TEXT("%s\n"),findDataArray[i].cFileName);
    			FileCopy(findDataArray[i], newDest);
            }
        }
     
    	if (findDataArray)
        {
            RapiFreeBuffer(findDataArray);
        }
     
    	return 0;
    }
     
    int main( int argc, char *argv[])
    {
    	HRESULT hRapiResult;
     
        int nResult;
     
        if (3 != argc)
        {
            _tprintf( TEXT("Syntax: PGET <wce file or directory> <host file or directory>\n"));
            return 1;
        }
     
    #ifdef UNICODE
        nResult = MultiByteToWideChar(
                        CP_ACP,    
                        MB_PRECOMPOSED,
                        argv[1],
                        (int) strlen(argv[1])+1,
                        wszSrcDir,
                        ARRAYSIZE(wszSrcDir));
        if(0 == nResult)
        {
    		_tprintf( TEXT("Failed to convert input arguement <wce file or directory>\n"));
            return 1;
        }
    #else
        hr = StringCchCopy(wszSrcDir, ARRAYSIZE(wszSrcDir), argv[1]);
        if(FAILED(hr))
        {
    		_tprintf( TEXT("Failed to convert input arguement <wce file or directory>\n"));
            return 1;
        }
    #endif
     
    #ifdef UNICODE
        nResult = MultiByteToWideChar(
                        CP_ACP,    
                        MB_PRECOMPOSED,
                        argv[2],
                        (int) strlen(argv[2])+1,
                        wszDestDir,
                        ARRAYSIZE(wszDestDir));
        if(0 == nResult)
        {
    		_tprintf( TEXT("Failed to convert input arguement <host file or directory>\n"));
            return 1;
        }
    #else
        hr = StringCchCopy(wszDestDir, ARRAYSIZE(wszDestDir), argv[2]);
        if(FAILED(hr))
        {
    		_tprintf( TEXT("Failed to convert input arguement <host file or directory>\n"));
            return 1;
        }
    #endif
     
    	_tprintf( TEXT("Connecting to Windows CE... "));
     
    	hRapiResult = CeRapiInit();
     
    	if (FAILED(hRapiResult))
    	{
    		_tprintf( TEXT("Failed\n"));
    		return 1;
    	}
     
    	_tprintf( TEXT("Success\n"));	
     
    	FoundFile( wszSrcDir, wszDestDir, 0); // appel fonction de traitement de fichier
     
    	_tprintf( TEXT("Closing connection ..."));
        CeRapiUninit();
        _tprintf( TEXT("Done\n"));
     
    	return 0;
    }

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    salut,

    quand la copie est terminé, la fenetre de copie ne se ferme pas.
    j'ai lu dans le message de YARP qu'il fallait faire une libération. Je dois faire quoi pour la faire??

    Ci-joint mon code:

    strcpy(destination, Path);
    strcpy(source, PathSource);
    structure_copie.hwnd=NULL;
    structure_copie.wFunc = FO_COPY;
    structure_copie.pTo =destination;
    structure_copie.pFrom =source;
    structure_copie.fFlags= FOF_SIMPLEPROGRESS | FOF_NOCONFIRMATION;
    structure_copie.fAnyOperationsAborted=true;
    structure_copie.hNameMappings=NULL;
    structure_copie.lpszProgressTitle="Copie des fichiers";
    int i =SHFileOperation( &structure_copie );

    Cette libération va permettre la fermeture de la fenetre?? Ou bien je dois faire un rafraichissement du bureau??

    merci d'avance.

  14. #14
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Salut rothuswarrior,
    Je voulais dire libération de la chaine allouée en #3.
    SHFileOperation utilise des chaines à double terminaison (dans pTo & pFrom) le principe étant que le séparateur de chaine est '\0' il faut donc "\0\0" pour indiquer à la fonction qu'elle a atteint la dernière chaine (y compris s'il n'y a qu'une seule chaine).
    Une telle structure oblige à allouer un char* qui contiendra toutes les chaines avec new (#3), donc il faut le libérer avec delete (#6).
    Pour le rafraichissement il faut sans doute le faire également mais cela dépends de l'interface.

    Si tu n'as qu'une seule chaine à copier tu peux bien entendu éviter #3 et #6.

    Le fait de ne pas libérer n'empêche pas la fenêtre de se fermer. Tu as un autre problème.
    L'erreur classique est de ne pas mettre "\0\0" à la fin des chaines (c'est le cas ici, sauf si tu as fait un ZeroMemory de destination et source avant).
    De même il faut toujours initialiser les structures avant de les utiliser. ZeroMemory(&structure_copie, soizeof(structure_copie)) serait le bienvenu.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    j'ai bien appliqué des Zeromemory aux chaines.
    le fenetre de copie reste ouverte.
    elle m'indique 0 secondes restantes, tout est copié, mais elle reste ouverte et sur l'interface, dans le titre plus precisement, il y a le message "ne repond pas" d'affiché.
    j'ai remarqué, qu'elle se ferme et le "ne repond pas" disparraissent, quand il y a un refraichissement du bureau.
    Ya une methode pour faire ce rafraichissement du bureau. J'ai essayé avec la touche F5, mais ca ne change rien. j'avais remarqué ca en installant Nero, et a la fin de l'installation quand le racourcis apparait sur le bureau.

    Quelqu'un a une idée???

  16. #16
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Pour forcer le rafraichissement regarde du côté de SHChangeNotify.

    J'utilise beaucoup SHFileOperation et je n'ai jamais eu le besoin de forcer le rafraichissement car c'est implicite avec Windows. Mais tout dépends de ce que tu copie bien entendu et sans le code source complet, le contexte etc... c'est difficile à dire.
    Le mieux est que tu lise la doc de SHFileOperation. Ce n'est pas long.

    En regardant de plus prêt il y a 2 ou 3 points qui me génent dans ton implémentation (ce n'est pas un reproche mais je n'aurais pas fait comme ça):
    - Manque ZeroMemory(&structure, sizeof(structure) (ça je l'ai déja dit)
    - fAnyOperationsAborted et hNameMappings sont des valeurs de retour de la fonction et les initialiser est un peu un contresens (=> ZeroMemory c'est mieux).
    - j'initialize toujours hwnd

    Je ne pense pas que ça va résoudre le problème mais je veux dire par là que Windows est parfois très sensible a de petits détails comme ça. Quand une fonction ne donne pas le résultat attendu je relit la doc et applique scrupuleusement toutes les consignes. Des fois ça marche.

    Sinon je n'ai jamais utilisé FOF_SIMPLEPROGRESS tu peux peut-être essayer de l'enlever pour voir.

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    salut, merci pour toutes tes explications.

    Je copies en fait tout un dossier (2.1G) d'un serveur par le réseau sur mon pc d'ou j'execute mon exe.
    Une fois cette copie terminé, il execute un programme qui est dans le dossier copié, mais la fenetre de copie reste ouverte.

    ci-joint le code complet:
    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
    //Copie des données Idb sur le PC client
     
    GetDlgItemText(IDC_SourceIdb, m_SourceIdb);
    PathSource=m_SourceIdb;
    PathSource+="\\*";
     
    Path=m_Path;
    Path+="\\allo";
    TempDest="D:\\allo";
     
     
    ZeroMemory(&structure_copie, sizeof(structure_copie));
    ZeroMemory(&destination, sizeof(destination));
    ZeroMemory(&source, sizeof(source));
     
    strcpy(destination, Path);
    strcpy(source, PathSource);
     
    structure_copie.hwnd=NULL;
    structure_copie.wFunc = FO_COPY;
    structure_copie.pTo =destination;
    structure_copie.pFrom =source;
    structure_copie.fFlags= FOF_SIMPLEPROGRESS | FOF_NOCONFIRMATION;
    structure_copie.fAnyOperationsAborted=true;
    structure_copie.hNameMappings=NULL;
    structure_copie.lpszProgressTitle="Copie des fichiers";
    int i =SHFileOperation( &structure_copie );
     
    free(destination);
    free(source);

    Qu'est-ce que tu changerais la dedans??

  18. #18
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    désolé je ne vois rien de plus dans ton code (lit à la fin j'ai vu un problème in fine):
    Tu peux essayer à tout hazard d'ajouter un 2ème '\0' à la fin des 2 chaines.
    Pour le code j'écrirais comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    structure_copie.hwnd=this->Handle; // ou ::GetActiveWindow()
    structure_copie.wFunc = FO_COPY;
    structure_copie.pTo =destination;
    structure_copie.pFrom =source;
    structure_copie.fFlags= FOF_NOCONFIRMATION;
    if (SHFileOpeartion(&structure_copie)==0) {
      // ok
    }
    Si tu fait une copie sur le réseau c'est effectivement plus problématique en terme de rafraichissement.
    De plus si tu travaille sous Vista ou W7 Microsoft préconise désormais de passer par IFileOperation au lieu de SHFIleOperation. Dans le cas de copie disque je n'ai pas remarqué de différence de comportement entre les 2 (ce serais étonnant) mais dans le cas de copie réseau je ne sais pas.

    Autrement dans le genre détail je vois:
    free(destination);
    Tu as alloué ta chaine avec malloc. J'ai souvent eu des problèmes avec malloc/free avec CBuilder mais jamais avec new/delete. Alors j'ai banni malloc.
    L'API Windows est également sensible à la façon dont tu alloue la mémoire.
    Pour une copie réseau peut-être que la mémoire virtuelle (GlobalAlloc) serait mieux.
    Mais pour une simple chaine je ferais d'abord ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char destination[MAX_PATH];
    char source[MAX_PATH];
    ZeroMemory(destination, MAX_PATH);
    ZeroMemory(source, MAX_PATH);
    Tiens oui, je n'avais pas remarqué Dans ton code il y a:
    ZeroMemory(&destination
    On ne met pas ZeroMemory(&destination pour une chaine mais ZeroMemory(destination. Car une chaine est un tableau d'éléments donc un pointeur.

    Pour finit un léger détail mais cela dépends évidemment des fichiers que tu copie:
    PathSource+="\\*.*"; // ça me rends toujours nerveux de mettre * seul

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    merci,

    je vais une fois essayer avec tes modifications.
    si ca ne donne rien, j'essairais avec IFileOperation

    a+

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    Un grand merci Yarp.

    Tout marche nikel.

    a+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Copie du contenu d' un dossier
    Par a7aa7a dans le forum Langage
    Réponses: 8
    Dernier message: 08/05/2007, 17h15
  2. [OmniMark 5] Copier contenu d'un dossier dans autre dossier
    Par Hoegaarden dans le forum Autres langages
    Réponses: 3
    Dernier message: 24/08/2005, 16h59
  3. afficher le contenu d'un dossier distant
    Par roots_man dans le forum ASP
    Réponses: 3
    Dernier message: 04/02/2005, 17h23
  4. Copie du contenu d'un répertoire vers un autre
    Par IG88 dans le forum Windows
    Réponses: 4
    Dernier message: 30/07/2004, 14h33
  5. [XSL]Copie du contenu d'un fichier en XSL
    Par fidififouille dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 16/06/2004, 12h35

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