Hilfe bei Ordnergröße ermitteln mit Code



  • Hallo, habe folgende Funktion aus einer Klasse kopiert:

    DWORD64 GetFolderSize(LPCTSTR szPath, DWORD *dwFiles, DWORD *dwFolders)
    {
    	TCHAR szFileFilter[512];
    	TCHAR szFilePath[512];
    	HANDLE hFind = NULL;
    	WIN32_FIND_DATA fileinfo;
    	DWORD64    dwSize = 0;
    
    	strcpy(szFilePath,szPath);
    	strcat(szFilePath,"\\");
    	strcpy(szFileFilter,szFilePath);
    	strcat(szFileFilter,"*.*");
    
    	hFind = FindFirstFile(szFileFilter,&fileinfo);
    	do
    	{
    		if(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    		{
    			if (!strcmp(fileinfo.cFileName,".") || !strcmp(fileinfo.cFileName,".."))
    			{
    				//Do nothing for "." and ".." folders
    			}
    			else
    			{
    				TCHAR sztmp[512];
    				strcpy(sztmp,szFilePath);
    				strcat(sztmp,fileinfo.cFileName);
    				dwSize = dwSize + GetFolderSize(sztmp);
    				if(dwFolders != NULL)
    				{
    					++(*dwFolders);
    				}
    			}
    		}
    		else
    		{
    			if(dwFiles != NULL)
    			{
    				++(*dwFiles);
    			}
    		}
    
    		dwSize += fileinfo.nFileSizeLow;
    
    	}while(FindNextFile(hFind,&fileinfo));
    
    	FindClose(hFind);
    	return dwSize;
    
    }
    

    So jetzt weiß ich nicht wofür die letzten beiden Parameter stehen, der erste muss ja wahrscheinlich für den Pfad stehen.


  • Mod

    Am besten man liest den Code!
    dwFiles ist ein Zeiger auf einen DWORD und zählt die Dateien (nicht die Größe), dwFolders zählt die Verzeichnisse.

    Die Notationist falsch. gemäß hungarian noation müssten diese Variablen pdwFiles und pdwFolders heißen.



  • Was müsste man am Code ändern, dass nur der Pfad als Parameter erwartet wird, damit man diese Funktion aufrufen kann?



  • Versteh den Code, dann kannst du ihn selbst ändern. 😉 🙄



  • Du könntest den beiden Zähler-Variablen den Default-Wert NULL mitgeben - oder ganz einfach jede Erwähnung dieser Variablen aus der Funktion aussortieren.



  • So besser?

    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    DWORD64 GetFolderSize(LPCTSTR szPath, DWORD *dwFiles, DWORD *dwFolders)
    {
    	TCHAR szFileFilter[512];
    	TCHAR szFilePath[512];
    	HANDLE hFind = NULL;
    	WIN32_FIND_DATA fileinfo;
    	DWORD64    dwSize = 0;
    
    	strcpy(szFilePath,szPath);
    	strcat(szFilePath,"\\");
    	strcpy(szFileFilter,szFilePath);
    	strcat(szFileFilter,"*.*");
    
    	hFind = FindFirstFile(szFileFilter,&fileinfo);
    	do
    	{
    		if(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    		{
    			if (!strcmp(fileinfo.cFileName,".") || !strcmp(fileinfo.cFileName,".."))
    			{
    				//Do nothing for "." and ".." folders
    			}
    			else
    			{
    				TCHAR sztmp[512];
    				strcpy(sztmp,szFilePath);
    				strcat(sztmp,fileinfo.cFileName);
    				dwSize = dwSize + GetFolderSize(sztmp, dwFiles, dwFolders);
    				if(dwFolders != NULL)
    				{
    					++(*dwFolders);
    				}
    			}
    		}
    		else
    		{
    			if(dwFiles != NULL)
    			{
    				++(*dwFiles);
    			}
    		}
    
    		dwSize += fileinfo.nFileSizeLow;
    
    	}while(FindNextFile(hFind,&fileinfo));
    
    	FindClose(hFind);
    	return dwSize;
    
    }
    
    int main()
    {
    	double size = GetFolderSize("c:\\wallpaper", NULL, NULL);
    	cout << (size/1024)/1024 << "MB (" << size/1024 << "KB)" << endl;
    
    	system("pause");
    	return 0;
    }
    

    Testet mal bei euch, hab paar kleine Rundungsfehler



  • Also wenn niemand hier was schreibt, dann müsste es wohl richtig sein oder?



  • kernel64 schrieb:

    Was müsste man am Code ändern, dass nur der Pfad als Parameter erwartet wird, damit man diese Funktion aufrufen kann?

    wenn das deine frage ist: Nein! die pointer stehn doch immer noch in der funktion. entweder dir ist es egal wie viel vom endergebnis denn nun ordner, und wie viel davon files sind oder du lässt dir sowas zurückgeben

    typedef struct FFolderSize
    {
         DWORD Files;
         DWORD Folders;
    }FolderSize;
    

    wenn man die unterornder nicht beachtet wirds dann ne recht kompakte schleife: einfach nur für jedes gefundene file ein ++found oder so.



  • Wie ich schon sagte: Default-Parameter:

    DWORD64 GetFolderSize(LPCTSTR szPath, DWORD *dwFiles=NULL, DWORD *dwFolders=NULL)
    {
      ...
    }
    

    (das bewirkt, daß die Parameter dwFiles und dwFolders automatisch auf NULL gesetzt werden, wenn du die Funktion nur mit einem Pfadnamen aufrufst (und in der Funktion bewirkt das, daß die Dateien und Ordner nicht mitgezählt werden))

    PS: Die Rundungsfehler könnten daher kommen, daß ein double nur begrenzte Genauigkeit hat - der kann eine 64-Bit-Zahl nicht bis auf die letzte Ziffer exakt darstellen.


Anmelden zum Antworten