Espace libre, utilisé, capacité d'un disque et taille d'un dossier

Contenu du snippet

tout est dans le titre

Source / Exemple :


#include <stdio.h>	/* Bibliotheque d'entrees sorties (printf, ...)          */
#include <afx.h>	/* Bibliotheque de parcours de fichiers (FindFile, ...)  */

/* Affiche l'erreur rencontree */
// MSDN help : http://msdn.microsoft.com/library/en-us/debug/base/getlasterror.asp
void error(LPSTR lpszFunction) 
{ 
	DWORD dw = GetLastError(); 
	printf("Fonction : %s a rencontre une erreur : Num erreur %u\\n",lpszFunction, dw); 
	puts("\\n\\n\\nPour quitter pressez la touche entree...");
	getchar();
	ExitProcess(dw); 
}// fin fonction error

/* Retourne l espace disque total libre
retour sur 8 octets */
// MSDN help : http://msdn.microsoft.com/library/en-us/fileio/base/getdiskfreespaceex.asp
unsigned _int64 DiskFreeSpaceAvailableTotal(char * pszRoot)
{
	ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;

	if(!GetDiskFreeSpaceEx(pszRoot, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes))
	{
		return 0;
	}
	else
	{
		return (unsigned _int64) liTotalFreeBytes.QuadPart;
	}// fin if
}// fin fonction DiskFreeSpaceAvailableTotal

/* Retourne l espace disque libre pour l'utilisateur courant
Si une gestion des quotas est mise en place cette taille sera différente de DiskFreeSpaceAvailableTotal
retour sur 8 octets */
// MSDN help : http://msdn.microsoft.com/library/en-us/fileio/base/getdiskfreespaceex.asp
unsigned _int64 DiskFreeSpaceAvailable(char * pszRoot)
{
	ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;

	if(!GetDiskFreeSpaceEx(pszRoot, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes))
	{
		return 0;
	}
	else
	{
		return (unsigned _int64) liFreeBytesAvailable.QuadPart;
	}// fin if
}// fin fonction DiskFreeSpaceAvailable

/* Retourne la taille du total du disque
retour sur 8 octets */
// MSDN help : http://msdn.microsoft.com/library/en-us/fileio/base/getdiskfreespaceex.asp
unsigned _int64 DiskSpaceTotal(char * pszRoot)
{
	ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;

	if(!GetDiskFreeSpaceEx(pszRoot, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes))
	{
		return 0;
	}
	else
	{
		return (unsigned _int64) liTotalBytes.QuadPart;
	}// fin if
}// fin fonction DiskSpaceTotal

/* Retourne la taille d'un dossier
retour sur 8 octets */
// MSDN help : http://msdn.microsoft.com/library/en-us/vclib/html/_mfc_CFileFind.asp
unsigned _int64 GetFolderSize(char * pChemin)
{
	unsigned _int64 taille = 0, tailletmp = 0;
	BOOL bContinue ;
	CFileFind listefichiers;
	char sNouveauChemin[MAX_PATH];
	char sCheminATester[MAX_PATH];
	char sNomFichier[MAX_PATH];

	lstrcpy(sNouveauChemin, pChemin); 
	strcat(sNouveauChemin, "\\\\*.*");
	//printf("--> START : %s\\n", sNouveauChemin);
	
	// Lancement du parcours de fichiers
	bContinue = listefichiers.FindFile(_T(sNouveauChemin));
	if(!bContinue)
	{
		error("GetFolderSize");
		return -1;
	}// fin if
	
	// Boucle sur tous les dossier et fichiers
	while (bContinue)
	{
		bContinue = listefichiers.FindNextFile();

		lstrcpy(sNomFichier, listefichiers.GetFileName());
		// Si . ou .. ne rien faire
		if(listefichiers.IsDots())
		{
			continue;

		}
		// Si dossier parcours de son arborescence & recuperation de sa taille
		else if (listefichiers.IsDirectory())
		{
			lstrcpy(sCheminATester, listefichiers.GetFilePath()); 
			tailletmp = GetFolderSize(sCheminATester);	
			if(tailletmp == -1)
			{
				return -1;
			}
			else
			{
				taille += tailletmp;
			}// end if
		}
		// Ajout de la taille de chaque fichiers à la taille totale du dossier pere
		else
		{
			taille += (unsigned _int64) listefichiers.GetLength();
		}// fin if
	}// fin while
	// fermeture du parcours de fichiers
	listefichiers.Close();
	// Renvoie la taille totale du dossier
	return taille;
}// fin GetFolderSize

void main(int argc, char *argv[])
{
	char * pPath[1] = {""};

	printf("#################################################\\n");
	printf("########## FONCTION INFO ESPACE DISQUE ##########\\n");
	printf("#################################################\\n\\n");
	
	// Test des arguments d'entrée
	if(argc == 1)
	{
		printf("Pas d'arguments, test du disque courant.\\n\\n");
		pPath[0] = NULL;
	}
	else if(argc == 2)
	{
		printf("arguments = %s.\\n",		argv[1]);
		pPath[0] = argv[1];
	}
	else
	{
		printf("Nombres d'arguments invalides.\\n");
		return;
	}// fin if

	// Test des fonctions
	printf("Lecteur de test = ''%s''.\\n",		pPath[0]);
	printf("\\nCapacite : %I64d octets.\\n",		DiskSpaceTotal(pPath[0]));
	printf("Espace libre : %I64d octets.\\n",	DiskFreeSpaceAvailable(pPath[0]));
	printf("Espace utilise : %I64d octets.\\n",	DiskSpaceTotal(pPath[0]) - DiskFreeSpaceAvailable(pPath[0]));
	if(pPath[0])
	{
		printf("Taille : %I64d octets.\\n",			GetFolderSize(pPath[0]));
	}// fin if

	/* Pause */
	puts("\\n\\n\\nPour quitter pressez la touche entree...");
	getchar();
}// fin fonction main

A voir également

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.