Fichier qui se copie lui même sans avoir besoin de son nom

Résolu
cs_kiitos Messages postés 34 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 14 septembre 2008 - 2 sept. 2008 à 21:59
 Utilisateur anonyme - 3 févr. 2013 à 17:58
Bonjours, je cherche comment créer un fichier exe capable de se copier lui même, et cela même si je le renome. J'ai besoin de votre aide parce que je me relance dans la programmation et je dois compléter mon fichier auto-extractible pour qu'il puisse fonctionner.

9 réponses

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
3 sept. 2008 à 18:36
Etant donner que tu as posté dans la catégorie "Windows" je t'ai donner une réponse pour Windows, maintenant si tu souhaites que ca reste générique utilise fopen, fread, fwrite, malloc.. a la place de CreateFile and co..

Si tu fais de la prog en mode console tu peux recuperer le nom du programme de cette facon:

int main(int argc, char *argv[])
{
printf("%s\n", argv[0]);
return 0;
}

Neo_Fr
3
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
2 sept. 2008 à 22:46
Utilise GetModuleFileName..

Un exemple:

DWORD __stdcall CopyModuleTo(LPSTR lpszFolder)
{
char szInFile[MAX_PATH+4];
char szOutFile[MAX_PATH+4];
LPSTR lpsrc, lpdst;
HANDLE hInFile, hOutFile;
BYTE* lpData;
DWORD dwRET = 0, br, bw;
lpdst = szOutFile;
while(*lpdst++ = *lpszFolder++); lpdst--;
if(*(lpdst-1) !'\\') *lpdst++ '\\';
lpsrc = szInFile + GetModuleFileName(0, szInFile, sizeof(szInFile));
printf("%s\n", szInFile);
hInFile = CreateFile(szInFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if(hInFile == INVALID_HANDLE_VALUE) return 0;
while(*lpsrc != '\\') lpsrc--;
while(*lpdst++ = *lpsrc++);
printf("%s\n", szOutFile);
hOutFile = CreateFile(szOutFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if(hOutFile == INVALID_HANDLE_VALUE) goto _Error;
lpData = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, 4096);
if(!lpData) goto _Error;
while(1)
{
if(!ReadFile(hInFile, lpData, 4096, &br, 0)) goto _Error;
if(!br) break;
if(!WriteFile(hOutFile, lpData, br, &bw, 0)) goto _Error;
dwRET += bw;
}
_Error:
if(lpData) HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpData);
if(hOutFile) CloseHandle(hOutFile);
CloseHandle(hInFile);
return dwRET;
}

int main(void)
{
DWORD i;
i = CopyModuleTo("C:\");
printf("%i octet ecrits\n", i);
system("PAUSE");
return 0;
}

Neo_Fr
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
2 sept. 2008 à 22:47
Oups, tu peux enlever les deux printf dans la fonction c'etait pour le debug ;)

Neo_Fr
0
jeffy131 Messages postés 123 Date d'inscription samedi 14 juillet 2007 Statut Membre Dernière intervention 29 mars 2009 1
3 sept. 2008 à 10:57
while(*lpsrc != '\\') lpsrc--;
    while(*lpdst++ = *lpsrc++);
    printf("%s\n", szOutFile);
    hOutFile = CreateFile(szOutFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if(hOutFile == INVALID_HANDLE_VALUE) goto _Error;
    lpData = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, 4096);

Quelle horreur...
Lire MSDN pour apprendre à copier un fichier.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_kiitos Messages postés 34 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 14 septembre 2008
3 sept. 2008 à 15:16
Est ce que c'est aussi possible si on fait en sorte qu'il reste portable sur tout les systèmes ?
0
cs_kiitos Messages postés 34 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 14 septembre 2008
5 sept. 2008 à 15:15
Merci beaucoup ! Ca ne fait que confirmer ce qu'à dit nanonavich dans l'autre forum, donc c'est surement la sollution la plus simple.
0
cs_kiitos Messages postés 34 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 14 septembre 2008
5 sept. 2008 à 15:24
J'ai un gros problème quand je compile, ça marque : main.c:3:

conflicting types for `argv'
main.c:3: previous declaration of `argv'
0
cs_kiitos Messages postés 34 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 14 septembre 2008
5 sept. 2008 à 15:28
C'est bon ! J'ai corrigé, en plus il y a même le chemin où se trouve le fichier, je ne pouvais pas demander mieux.
0
Utilisateur anonyme
3 févr. 2013 à 17:58
monsieur Neo_Fr
ton programme il fonctionne très bien mais juste une question, si je veux copier le programme et je le sauvegarde avec un autre nom comment peut on faire ça
MERCI
0
Rejoignez-nous