Modifier rapidement son fichier host

Soyez le premier à donner votre avis sur cette source.

Vue 5 443 fois - Téléchargée 292 fois

Description

J'ai crée ce petit programme parce que j'accède souvent à mon fichier host pour le modifier.

Simplement, vous lancez le programme, il détermine le chemin d'accès au fichier host puis vous demande d'entrer la valeur à ajouter à celui ci.
Je partage donc la source à tout hasard pour les personnes intéressée, à titre "pédagogique" et aussi pour recevoir des critiques sur la qualité du code.

Celui-ci a été développé sous code blocks. C'est un projet d'extension .cbp.

Source / Exemple :


main.c

#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#include "file.h"

char *getHostPath();
int   getKeyboardInput( char *buffer, int *length );
void  menu();

int main (void)
{
    menu();

    /* On détermine le chemin d'accès au fichier hosts */
    char *hostPath = getHostPath();

    char *hostBuffer = NULL;
    int  *hostSize   = (int*)malloc(sizeof(int));
    /* On mémorise dans une chaine de caractères le fichier host */
    memorizeFile( hostPath, &hostBuffer, hostSize );

    char addToHostBuffer[127];
    int *addToHostSize = (int*)malloc(sizeof(int));

  • addToHostSize = 127;
/* On saisie la ligne à ajouter dans le fichier hosts */ getKeyboardInput( addToHostBuffer, addToHostSize ); /* On ajoute la saisie à la ligne suivante du fichier hosts */ addCharInString( &hostBuffer, '\n', strlen(hostBuffer) ); char *newHost; /* On concatène la saisie au fichier hosts */ concat( &newHost, hostBuffer, addToHostBuffer); /* On enregistre la saisie dans le fichier host */ saveFile( hostPath, newHost ); /* Désallocation des ressources mémoires */ free(addToHostSize); free(hostBuffer); free(hostSize); free(newHost); return 0; } void menu() { system("title EASY HOST"); printf("\n\n +-----------------------------------------------------+"); printf("\n | EASY HOST |"); printf("\n +-----------------------------------------------------+\n\n"); printf(" > Add a new value : example -> 127.0.0.1 facebook.fr\n\n"); printf(" > value : "); } char *getHostPath() { const char *homeDrive = getenv("HOMEDRIVE"); char *hostPath; concat(&hostPath, homeDrive, "\\Windows\\System32\\drivers\\etc\\hosts"); return hostPath; } int getKeyboardInput( char *buffer, int *length ) { /* */ if ( buffer != NULL ) { /* Si la saisie a reussie */ if ( fgets( buffer, *length, stdin ) != NULL ) { /* On supprime le possible retour chariot */
  • length=0;
while ( *buffer != '\0' ) { if ( *buffer == '\n' ) {
  • buffer = '\0';
} buffer++; (*length)++; } /* On retourne 1 : la saisie a correctement été traité */ /* On vide stdin en cas d'overflow du buffer */ fflush(stdin); return 1; } /* Si erreur on retourne 0 */ else { return 0; } } /* Si erreur, on retourne -1 */ else { return -1; } } file.h #ifndef _FILE_H_ #define _FILE_H_ /* Fonction qui enregistre un fichier dans une chaine de caractère Entrée : filepath un pointeur sur le chemin du fichier buffer un double pointeur sur la chaine qui va contenir le fichier bufferSize un pointeur sur la longueur du fichier
  • /
void memorizeFile( char *filePath, char **buffer, int *bufferSize ) { FILE *fichier=fopen(filePath,"r"); if( fichier != NULL && buffer != NULL && bufferSize != NULL) { char c;
  • bufferSize = 0;
  • buffer = NULL;
char *reallocatedBuffer=NULL; while( fscanf(fichier,"%c",&c) != EOF ) { reallocatedBuffer = realloc( reallocatedBuffer, (*bufferSize+1)*sizeof(char)); if ( reallocatedBuffer != NULL ) {
  • buffer = reallocatedBuffer;
(*buffer)[*bufferSize] = c;
  • bufferSize= *bufferSize+1;
} else {
  • buffer=NULL;
  • bufferSize=0;
printf("\n\n memorizeFile : 2 "); } } } else perror("\n\n memorizeFile 1 : "); fclose(fichier); } /* Fonction qui enregistre une chaine de caractère dans un fichier Entrée : filepath un pointeur sur le chemin du fichier string un pointeur sur la chaine dont le contenu est à enregistrer
  • /
void saveFile( char *filePath, char *string ) { FILE *file=fopen(filePath,"w"); printf("OK"); if( file != NULL && filePath != NULL ) { int i; for( i=0 ; i<strLen(string)+1 ; i++ ) { fprintf( file, "%c", string[i] ); printf( "%c", string[i] ); } } else perror("\n\n saveFile : "); fclose(file); } #endif string.h #ifndef _STRING_H_ #define _STRING_H_ /* Fonction qui retourne la longueur d'une chaine Entrée : s un pointeur sur la chaine Sortie : la longueur de la chaine
  • /
int strLen( char *s ) { if ( s != NULL ) { int length=0; while ( *s != '\0') { length++; s++; } return length; } else perror("\n strLen "); } /* Fonction qui concatène deux chaines Entrée : s1 un pointeur sur la première chaine s2 un pointeur sur la seconde chaine s un double pointeur sur le resultat de la concaténation
  • /
void concat( char **s, char *s1, char *s2 ) {
  • s = (char*)malloc( (strLen(s1)+strLen(s2)+1)*sizeof(char) );
if ( s != NULL && s1 != NULL && s2 != NULL ) { int i; for ( i=0 ; i<strLen(s1) ; i++ ) { (*s)[i] = s1[i]; } for ( i=strLen(s1) ; i<strLen(s1)+strLen(s2)+1 ; i++ ) { (*s)[i] = s2[i-strLen(s1)]; } } else perror("\n concat : \n"); } /* Fonction qui rajoute un caractère dans une chaine Entrée : s un double pointeur sur la chaine c le caractère à insérer offset la position du caractère à insérer
  • /
void addCharInString( char **s, char c, int offset) { if ( s != NULL) { char *s1 = (char*)malloc( (strLen(*s)-offset+1)*sizeof(char) ); if ( s1 != NULL ) { int i; for ( i=offset ; i<strLen(*s)+1 ; i++ ) { s1[i-offset]=(*s)[i]; } char *reallocatedString = (char*)realloc( *s, (strLen(*s)+2)*sizeof(char) ); if ( reallocatedString != NULL ) {
  • s = reallocatedString;
(*s)[offset]=c; for( i=offset+1 ; i<strLen(*s)+2 ; i++) { (*s)[i]=s1[i-offset-1]; } } else perror("\n addCharInString 3"); } else perror("\n addCharInString 2"); } else perror("\n addCharInString 1"); } #endif

Conclusion :


Merci de votre participation. Bonne continuation.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
13229
Date d'inscription
jeudi 31 janvier 2013
Statut
Membre
Dernière intervention
25 juillet 2021

en autoit c'est deux lignes pour rajouter des lignes dans le fichier host...
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
30 avril 2009

Quand je parle de rapidité, je ne parle pas de l'exécution du code mais plutôt du temps sauvegardé à se balader dans l'arborescence de windows. Certes, realloc n'est pas ce qu'il y a de plus rapide, mais 0.1s ou 0.01s, pour l'utilisateur c'est transparent. C'est pas comme si le fichier Host faisait 10Mo, je crois que votre remarque n'est pas pertinente dans ce cas.
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
"MODIFIER RAPIDEMENT SON FICHIER HOST", pour la rapidité on repassera.. :p

Des realloc? pour quoi faire?, les strlen on les met pas dans la boucle sinon ils sont rappeler a chaque itération et on lit pas un fichier octet par octet surtout en faisant des realloc a chaque octet, c'est pas optimiser du tout :\

J'avais fait une fonction semblable il y a quelque temps...

DWORD __stdcall BlockURL(LPSTR lpszURL) // ex: BlockURL("google.com");
{
char szLoopBack[] = "127.0.0.1";
char szHostPath[MAX_PATH+4];
LPSTR lpData, lptr;
HANDLE hFile;
DWORD dwLen, bw;

lptr = szHostPath + GetSystemDirectory(szHostPath, sizeof(szHostPath));
lstrcpy(lptr, "\\drivers\\etc\\hosts");
hFile = CreateFile(szHostPath, GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) return 1;
lpData = (LPSTR) HeapAlloc(GetProcessHeap(), 0, 4096);
if(!lpData) { CloseHandle(hFile); return 1; } lptr lpData; *((WORD*) lptr)++ '\r\n';
dwLen = sizeof(szLoopBack)-1;
memcpy(lptr, szLoopBack, dwLen); lptr+=dwLen;
*lptr++ = ' ';
dwLen = strlen(lpszURL);
memcpy(lptr, lpszURL, dwLen); lptr+=dwLen;
SetFilePointer(hFile, 0, 0, FILE_END);
WriteFile(hFile, lpData, (lptr-lpData), &bw, 0);
HeapFree(GetProcessHeap(), 0, lpData);
CloseHandle(hFile);
return 0;
}

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.