begin process at 2012 05 27 13:43:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > ARO : ANTIREADONLY -> MODIFIER LES FICHIERS EN LECTURE SEULE EN FICHIER "NORMAUX" (VISUAL C++ 6.0)

ARO : ANTIREADONLY -> MODIFIER LES FICHIERS EN LECTURE SEULE EN FICHIER "NORMAUX" (VISUAL C++ 6.0)


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichiers / Disque Niveau :Initié Date de création :24/06/2002 Date de mise à jour :09/11/2002 15:42:13 Vu / téléchargé :5 506 / 140

Auteur : JMGR

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Vous pouvez modifier les fichiers en lecture seule en fichiers modifiables...
Très utile pour les fichiers copiés à partir d'un CD ROM.  

Source

  • //ARO par J.M.G.R commencé le 23/06/02 et terminé le 24/06/02
  • //ARO = AntiReadOnly
  • //PS : J'ai écrit ce programme en anglais pour que tout le monde puisse l'utiliser... De toute façon vous avez les commentaires...
  • //J'ai créé ce programme car j'en avait marre que Windows me laisse les fichiers que j'ai copié d'un CD Rom en lecture seule, ce qui gênait la compilation de mes programmes (évidemment)
  • #include <windows.h>//Pour FindFirstFile, FindNextFile, FindClose, GetCurrentDirectory...
  • #include <stdio.h>//Pour printf, sprintf
  • #include <conio.h>//Pour getch
  • static long NumFiles=0,NumDir=0,NumRO=0,NumErr=0;//Le nombre de :
  • //Fichier normaux, de dossiers, de fichiers en lecture seule, d'erreurs
  • void finder(char dir[])//La fonction de recherche de fichier en lecture seule
  • {
  • char temp[256]="";//Chaine temporaire (très utile !)
  • printf("Scanning %s...\n",dir);//Bon, les printf je ne met pas de commentaires, je crois que c'est clair...
  • WIN32_FIND_DATA find;//Pour le retour de FindFirstFile et FindNextFile
  • GetCurrentDirectory(256,temp);//On trouve de dossier de l'exe
  • if(!strcmp(dir,"local directory"))//Si le dossier est local (pas d'arguments dans l'exécutable)
  • strcpy(dir,temp);//On met le dossier de l'exe
  • printf("%s\n",dir);
  • sprintf(temp,"%s\\*.*",dir);//On met dans temp le dossier + *.* pour la recherche (comme pour Outils\Rechercher\Fichiers ou dossiers du navigateur de Windows 98)
  • HANDLE fin = FindFirstFile(temp,&find);//On recherche le 1er fichier (toujours .)
  • FindNextFile(fin,&find);//On recherche le 2ème fichier (toujours ..)
  • for(;;)//Boucle pour trouver les fichiers
  • {
  • strcpy(temp,find.cFileName);//On met dans temp le fichier trouvé au dernier passage
  • FindNextFile(fin,&find);//On trouve le fichier suivant
  • if(strcmp(temp,find.cFileName))//Si le fichier précédent est différent du fichier trouvé (pour voir quand il n'y a plus de fichier non trouvé (la fonction FindNextFile répète toujours le même fichier... Oui je sait c'est artisanal.))
  • {
  • if(find.dwFileAttributes&FILE_ATTRIBUTE_READONLY)//Si le fichier est en lecture seule
  • {
  • printf("Find read only : %s\n",find.cFileName);
  • printf("Set to normal : ");
  • sprintf(temp,"%s\\%s",dir,find.cFileName);//On obtient le chemin du fichier
  • if(SetFileAttributes(temp,FILE_ATTRIBUTE_NORMAL)!=0)//Si la fonction que le met en mode "normal"
  • printf("ok!");//Réussit
  • else
  • {
  • printf("error! (%d)",GetLastError());//Echoue, on prends le code d'erreur
  • NumErr++;//Et on incrémente (augmente de 1) le nombre d'erreurs
  • }
  • printf("\n");
  • NumRO++;//On incrémente le nombre de fichiers en lecture seule
  • }
  • else if(find.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)//Si on trouve un dossier
  • {
  • printf("Find directory : %s\n",find.cFileName);
  • strcpy(temp,dir);
  • strcat(temp,"\\");
  • strcat(temp,find.cFileName);//On obtient le nouveau chemin avec l'ancien + le nouveau dossier
  • printf("Change directory to %s...\n",temp);
  • finder(temp);//On appelle la fonction avec pour paramètre le nouveau chemin
  • NumDir++;//On incrémente le nombre de dossiers
  • }
  • else//Sinon c'est un fichier qui n'est pas en lecture seule
  • {
  • printf("Find normal file : %s\n",find.cFileName);
  • NumFiles++;//On incrémente le nombre de fichiers "normaux"
  • }
  • }
  • else//Sinon on a trouvé tout les fichiers
  • {
  • break;//Et on quitte la boucle
  • }
  • }
  • FindClose(fin);//On ferme le HANDLE pour éviter des erreurs...
  • }
  • int main(int argc, char* argv[])//Argc contient le nombre d'arguments et argv les arguments
  • {
  • printf("Anti Read Only 1.0 by J.M.G.R\n");
  • printf("Press any key to start scanning process !\n");
  • getch();//On attends qu'on appuie sur une touche
  • char temp[256];//Temp comme avant
  • if(argc>1)//Si il y a un argument
  • {
  • strcpy(temp,argv[1]);//On copie cet argument qui est le dossier qui doit être scanné
  • finder(temp);//On scanne
  • }
  • else
  • finder("local directory");//Sinon on scanne avec pour argument "local directory" qui indiquera à la fonction qu'on veut scanner le dossier de l'exe
  • printf("Total : %ld Normal file(s), %ld Directory(ies), %ld Read - Only file(s) and %ld error(s)\n",NumFiles,NumDir,NumRO,NumErr);
  • getch();//On attends qu'on appuie sur une touche
  • return 0;//On quitte main()
  • }
//ARO par J.M.G.R commencé le 23/06/02 et terminé le 24/06/02
//ARO = AntiReadOnly
//PS : J'ai écrit ce programme en anglais pour que tout le monde puisse l'utiliser... De toute façon vous avez les commentaires...
//J'ai créé ce programme car j'en avait marre que Windows me laisse les fichiers que j'ai copié d'un CD Rom en lecture seule, ce qui gênait la compilation de mes programmes (évidemment)

#include <windows.h>//Pour FindFirstFile, FindNextFile, FindClose, GetCurrentDirectory...
#include <stdio.h>//Pour printf, sprintf
#include <conio.h>//Pour getch

static long NumFiles=0,NumDir=0,NumRO=0,NumErr=0;//Le nombre de :
//Fichier normaux, de dossiers, de fichiers en lecture seule, d'erreurs

void finder(char dir[])//La fonction de recherche de fichier en lecture seule
{
	char temp[256]="";//Chaine temporaire (très utile !)
	printf("Scanning %s...\n",dir);//Bon, les printf je ne met pas de commentaires, je crois que c'est clair...
	WIN32_FIND_DATA find;//Pour le retour de FindFirstFile et FindNextFile
	GetCurrentDirectory(256,temp);//On trouve de dossier de l'exe
	if(!strcmp(dir,"local directory"))//Si le dossier est local (pas d'arguments dans l'exécutable) 
		strcpy(dir,temp);//On met le dossier de l'exe
	printf("%s\n",dir);
	sprintf(temp,"%s\\*.*",dir);//On met dans temp le dossier + *.* pour la recherche (comme pour Outils\Rechercher\Fichiers ou dossiers du navigateur de Windows 98)
	HANDLE fin = FindFirstFile(temp,&find);//On recherche le 1er fichier (toujours .)
	FindNextFile(fin,&find);//On recherche le 2ème fichier (toujours ..)
	for(;;)//Boucle pour trouver les fichiers
	{
		strcpy(temp,find.cFileName);//On met dans temp le fichier trouvé au dernier passage
		FindNextFile(fin,&find);//On trouve le fichier suivant
		if(strcmp(temp,find.cFileName))//Si le fichier précédent est différent du fichier trouvé (pour voir quand il n'y a plus de fichier non trouvé (la fonction FindNextFile répète toujours le même fichier... Oui je sait c'est artisanal.))
		{
			if(find.dwFileAttributes&FILE_ATTRIBUTE_READONLY)//Si le fichier est en lecture seule
			{
				printf("Find read only : %s\n",find.cFileName);
				printf("Set to normal : ");
				sprintf(temp,"%s\\%s",dir,find.cFileName);//On obtient le chemin du fichier
				if(SetFileAttributes(temp,FILE_ATTRIBUTE_NORMAL)!=0)//Si la fonction que le met en mode "normal"
					printf("ok!");//Réussit
				else
				{
					printf("error! (%d)",GetLastError());//Echoue, on prends le code d'erreur
					NumErr++;//Et on incrémente (augmente de 1) le nombre d'erreurs
				}
				printf("\n");
				NumRO++;//On incrémente le nombre de fichiers en lecture seule
			}
			else if(find.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)//Si on trouve un dossier
			{
				printf("Find directory : %s\n",find.cFileName);
				strcpy(temp,dir);
				strcat(temp,"\\");
				strcat(temp,find.cFileName);//On obtient le nouveau chemin avec l'ancien + le nouveau dossier
				printf("Change directory to %s...\n",temp);
				finder(temp);//On appelle la fonction avec pour paramètre le nouveau chemin
				NumDir++;//On incrémente le nombre de dossiers
			}
			else//Sinon c'est un fichier qui n'est pas en lecture seule
			{
				printf("Find normal file : %s\n",find.cFileName);
				NumFiles++;//On incrémente le nombre de fichiers "normaux"
			}
		}
		else//Sinon on a trouvé tout les fichiers
		{
			break;//Et on quitte la boucle
		}
	}
	FindClose(fin);//On ferme le HANDLE pour éviter des erreurs...
}

int main(int argc, char* argv[])//Argc contient le nombre d'arguments et argv les arguments
{
	printf("Anti Read Only 1.0 by J.M.G.R\n");
	printf("Press any key to start scanning process !\n");
	getch();//On attends qu'on appuie sur une touche
	char temp[256];//Temp comme avant
	if(argc>1)//Si il y a un argument
	{
		strcpy(temp,argv[1]);//On copie cet argument qui est le dossier qui doit être scanné
		finder(temp);//On scanne
	}
	else
		finder("local directory");//Sinon on scanne avec pour argument "local directory" qui indiquera à la fonction qu'on veut scanner le dossier de l'exe
	printf("Total : %ld Normal file(s), %ld Directory(ies), %ld Read - Only file(s) and %ld error(s)\n",NumFiles,NumDir,NumRO,NumErr);
	getch();//On attends qu'on appuie sur une touche
	return 0;//On quitte main()
}  

 Conclusion

Voila ;)
Pensez à mettre comme argument le dossier à scanner...
ATTENTION ! Il scanne aussi les sous - dossiers !
Merci de lire le fichier A lire.txt :p)  

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

COMPTER LE NOMBRE DE PAGES D'UN FICHIER PDF par Renfield
Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel

Commentaires et avis

Commentaire de gaya le 08/08/2002 03:28:55

Joli programme bien expliqué, on voit que tu as fais des efforts.
Dommage que la largeur d'affichage du site en réduise la lisibilité.

Bonne continuation JMGR, @+

Commentaire de JMGR le 08/08/2002 14:55:56

Merci,
a+

Commentaire de TheLudo2013 le 12/11/2002 02:47:31

Dommage que ta fonction qui recherche les fichiers ne cherche pas dans tous les sous répertoire. De plus je trouve bourin de comparer le nom du fichier précedent avec celui trouvé (sois-disant pour voir quand il y en a plus) : a tu oublie que FindNextFile() avait une valeur de retour(lol).

Commentaire de JMGR le 12/11/2002 07:12:20

Hum... Il me semble qu'il scanne aussi les sous-dossiers, non ?
Je cite "ATTENTION ! Il scanne aussi les sous - dossiers !".
Sinon pour le FindNextFile() qui renvoit une valeur je suis d'accord avec toi, mais bon quesque tu veut... Je suis un débutant, moi ^^

Commentaire de zorlac le 14/12/2004 15:39:36

pas mal pour un jeune, essaie de prendre l'habitude d'initialiser tes structure par un memset ou zeromemory pour être sûr qu'il va allouer sur le stack la taille nécessaire, dans mon exemple ici en bas j'ai aussi oublié de le faire ;-)
SYSTEMTIME CUpdateMaker::GetSystTimeFile(std::string filename)
{
WIN32_FILE_ATTRIBUTE_DATA FileInformation;
memset(&FileInformation, 0, sizeof(WIN32_FILE_ATTRIBUTE_DATA));
FILETIME lastwrite;
memset(&lastwrite, 0, sizeof(FILETIME));
SYSTEMTIME Systlastwrite;
GetFileAttributesEx(filename.c_str(), GetFileExInfoStandard, &FileInformation);
lastwrite = FileInformation.ftLastWriteTime;
//needed otherwise utc => localtime!
FileTimeToLocalFileTime(&lastwrite, &lastwrite);
FileTimeToSystemTime(&lastwrite, &Systlastwrite);
return Systlastwrite;
}

int CUpdateMaker::CompareWORD(WORD value1, WORD value2)
{
if(value1 > value2)
return 1;
else if(value1 < value2)
return -1;
else
return 0;
}
int CUpdateMaker::CompareSystemTime(SYSTEMTIME time1, SYSTEMTIME time2)
{
//1:newer, -1:older, 0:same
//compare year
int result = CompareWORD(time1.wYear, time2.wYear);
if( result !=0)
return result;
//compare month
result = CompareWORD(time1.wMonth, time2.wMonth);
if( result !=0)
return result;
//compare day
result = CompareWORD(time1.wDay, time2.wDay);
if( result !=0)
return result;
//compare hour
result = CompareWORD(time1.wHour, time2.wHour);
if( result !=0)
return result;
//compare minute
result = CompareWORD(time1.wMinute, time2.wMinute);
if( result !=0)
return result;
//compare second
result = CompareWORD(time1.wSecond, time2.wSecond);
if( result !=0)
return result;

//compare millisecondes
//result = CompareWORD(time1.wMilliseconds, time2.wMilliseconds);
//if( result !=0)
// return result;

return 0;
}

int CUpdateMaker::ManageAll(void)
{
for(int i=0; i < m_PathInputArray.size() ; i++)
{
RecursiveBuild(m_PathInputArray[i].value, m_PathOutputArray[i].value );
}
return 0;
}


int CUpdateMaker::RecursiveBuild(std ::string AttributesIn,  std::string AttributesOut)
{
int success;
AttributesIn = CheckSlashEndPath(AttributesIn);
AttributesOut = CheckSlashEndPath(AttributesOut);
CreateRecursiveDirectory(AttributesOut);

WIN32_FIND_DATA l_FindData;
std::string SourcePath = AttributesIn + "*.*";
std::string DestinationPath = AttributesOut + "*.*";
std::string in, out;
//it passed by . and ..!

HANDLE l_hFindFile=::FindFirstFile(SourcePath.c_str(), &l_FindData);
if (INVALID_HANDLE_VALUE==l_hFindFile)
{
WriteLog("ERROR : We cannot find any files\n");
}

while(l_hFindFile!=INVALID_HANDLE_VALUE)
{
std::string EntryName(l_FindData.cFileName);
   in = AttributesIn  + EntryName;
out = AttributesOut + EntryName;
if(EntryName != "." && EntryName != ".." && FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(in.c_str()))
RecursiveBuild(in, out);
if(EntryName != "." && EntryName != ".." && FILE_ATTRIBUTE_DIRECTORY != GetFileAttributes(in.c_str()))
{
success = CopyFileToOutput(in, out);
if(success == -1)
return -1;
}
if(0==::FindNextFile(l_hFindFile, &l_FindData))
break;
}
::FindClose(l_hFindFile);

return 0;
}


int CUpdateMaker::CopyFileToOutput(std::string AllInPath, std::string AllOutPath)
{
int success;
DWORD resError;
std::string outlog;

if(_access(AllOutPath.c_str(), 0) == -1)
{
success = CopyFile(AllInPath.c_str(), AllOutPath.c_str(), FALSE);
if(success == 0)
{
WriteLog("ERROR: Cannot copy file to destination\n");
return -1;   
}
outlog = "File copied in : " + AllOutPath + "\n";
WriteLog(outlog.c_str());
}
else
{
int result = CompareSystemTime(GetSystTimeFile(AllInPath), GetSystTimeFile(AllOutPath));
if(result == 1)
{
success = SetFileAttributes(AllOutPath.c_str(), FILE_ATTRIBUTE_NORMAL);
if(success == 0)
{
WriteLog("ERROR: Cannot set file  attributes\n");
return -1;   
}
success = DeleteFile(AllOutPath.c_str());
if(success == 0)
{
resError = GetLastError();
WriteLog("ERROR: Cannot delete file \n");
return -1;   
}

success = CopyFile(AllInPath.c_str(), AllOutPath.c_str(), FALSE);
if(success == 0)
{
WriteLog("ERROR: Cannot copy file to destination\n");
return -1;   
}
outlog = "File copied in : " + AllOutPath + "\n";
WriteLog(outlog.c_str());
}
}

return 0;
}

Commentaire de JMGR le 14/12/2004 19:27:52

Wah !
Hé bin, c'est impressionnant ;)

Mais bon ça fait quelques années que j'ai posté cette source donc depuis je me suis amélioré et je fait maintenant dans l'OpenSource, fini windows ;)

En tous les cas, bravo pour ton code !

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,328 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales