Aro : antireadonly -> modifier les fichiers en lecture seule en fichier "normaux" (visual c++ 6.0)

Soyez le premier à donner votre avis sur cette source.

Vue 6 767 fois - Téléchargée 227 fois


Description

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 / Exemple :


//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)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
67
Date d'inscription
vendredi 28 décembre 2001
Statut
Membre
Dernière intervention
23 juin 2015

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 !
Messages postés
17
Date d'inscription
lundi 6 janvier 2003
Statut
Membre
Dernière intervention
14 août 2005

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;
}
Messages postés
67
Date d'inscription
vendredi 28 décembre 2001
Statut
Membre
Dernière intervention
23 juin 2015

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 ^^
Messages postés
77
Date d'inscription
mardi 12 novembre 2002
Statut
Membre
Dernière intervention
18 octobre 2007

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).
Messages postés
67
Date d'inscription
vendredi 28 décembre 2001
Statut
Membre
Dernière intervention
23 juin 2015

Merci,
a+
Afficher les 6 commentaires

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.