Fichier qui se copie lui même sans avoir besoin de son nom [Résolu]

Signaler
Messages postés
34
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
14 septembre 2008
-
Messages postés
43
Date d'inscription
vendredi 22 avril 2011
Statut
Membre
Dernière intervention
2 juin 2014
-
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

Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
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
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
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
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Oups, tu peux enlever les deux printf dans la fonction c'etait pour le debug ;)

Neo_Fr
Messages postés
123
Date d'inscription
samedi 14 juillet 2007
Statut
Membre
Dernière intervention
29 mars 2009
1
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.
Messages postés
34
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
14 septembre 2008

Est ce que c'est aussi possible si on fait en sorte qu'il reste portable sur tout les systèmes ?
Messages postés
34
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
14 septembre 2008

Merci beaucoup ! Ca ne fait que confirmer ce qu'à dit nanonavich dans l'autre forum, donc c'est surement la sollution la plus simple.
Messages postés
34
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
14 septembre 2008

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'
Messages postés
34
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
14 septembre 2008

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.
Messages postés
43
Date d'inscription
vendredi 22 avril 2011
Statut
Membre
Dernière intervention
2 juin 2014

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