Решение C # отлично подходит для папок небольшого размера, но если ваше приложение (по какой-либо причине) имеет большое количество файлов, этот метод займет много времени, и у вас может даже закончиться нехватка памяти. Я столкнулся с этой ситуацией и решил написать компонент winrt c ++, который получает размер папки, и я могу подтвердить, что он работает намного быстрее и с меньшим объемом памяти. Код для функции приведен ниже, в коде c # вы можете вызвать GetAppUsedSpace, используя свойство Path в папке LocalState.
#include "pch.h"
#include "NativeFileHelper.h"
#include <string>
#include <vector>
#include <stack>
#include <iostream>
#include <windows.h>
using namespace Platform;
NativeFileHelper::NativeFileHelper()
{
}
unsigned __int64 ListFiles(std::wstring path, std::wstring mask) {
HANDLE hFind = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA ffd;
std::wstring spec;
std::stack<std::wstring> directories;
directories.push(path);
unsigned __int64 result = 0;
while (!directories.empty()) {
path = directories.top();
spec = path + L"\\" + mask;
directories.pop();
hFind = FindFirstFileEx(spec.c_str(), FindExInfoStandard, &ffd, FINDEX_SEARCH_OPS::FindExSearchNameMatch, NULL, FIND_FIRST_EX_LARGE_FETCH);
if (hFind == INVALID_HANDLE_VALUE) {
return result;
}
do {
if (wcscmp(ffd.cFileName, L".") != 0 &&
wcscmp(ffd.cFileName, L"..") != 0) {
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
directories.push(path + L"\\" + ffd.cFileName);
}
else {
//This is file name
result += ffd.nFileSizeLow + (ffd.nFileSizeHigh * MAXDWORD);
//files.push_back(path + "\\" + ffd.cFileName);
}
}
} while (FindNextFile(hFind, &ffd) != 0);
if (GetLastError() != ERROR_NO_MORE_FILES) {
FindClose(hFind);
return result;
}
FindClose(hFind);
hFind = INVALID_HANDLE_VALUE;
}
return result;
}
unsigned __int64 NativeFileHelper::GetAppUsedSpace(Platform::String^ pathOfFolder)
{
unsigned __int64 size = ListFiles(pathOfFolder->Data(), L"*");
return size;
}