UWP не может получить размер папки [duplicate]

Для примера предположим, что у вас есть класс Person с помощью только name.

private class Person {
    public String name;

    public Person(String name) {
        this.name = name;
    }
}

Google GSON ( Maven )

Мой личный фаворит в отношении большой сериализации / де-сериализации объектов JSON.

Gson g = new Gson();

Person person = g.fromJson("{\"name\": \"John\"}", Person.class);
System.out.println(person.name); //John

System.out.println(g.toJson(person)); // {"name":"John"}

Обновить

Если вы хотите получить вы можете легко сделать это с помощью библиотеки Google:

JsonObject jsonObject = new JsonParser().parse("{\"name\": \"John\"}").getAsJsonObject();

System.out.println(jsonObject.get("name").getAsString()); //John

Org.JSON ( Maven )

Если вам не нужна де-сериализация объекта, а просто получить атрибут, вы можете попробовать org.json (или посмотреть пример GSON выше!) [/ ​​g13]

JSONObject obj = new JSONObject("{\"name\": \"John\"}");

System.out.println(obj.getString("name")); //John

Джексон ( Maven )

ObjectMapper mapper = new ObjectMapper();
Person user = mapper.readValue("{\"name\": \"John\"}", Person.class);

System.out.println(user.name); //John

3
задан Jitendra Jadav 10 March 2014 в 10:31
поделиться

2 ответа

Решение 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;
    }
2
ответ дан Andres 26 August 2018 в 05:56
поделиться

Вы можете получить доступ к LocalFolder с помощью свойства ApplicationData.LocalFolder .

Этот LocalFolder является объектом StorageFolder , StorageFolder имеет метод, называемый GetBasicPropertiesAsync .

GetBasicPropertiesAsync возвращает объект BasicProperties . Этот объект BasicProperties имеет свойство Size , которое сообщает вам размер рассматриваемого элемента (папки или файла). Я считаю, что Size находится в байтах (a ulong).

Полную команду можно выполнить в одной строке в методе async следующим образом:

(await ApplicationData.LocalFolder.GetBasicPropertiesAsync()).Size;

Вы также можете разделить каждый шаг, если вам нужна какая-либо другая информация.

Изменить: По-видимому, это не работает так хорошо, как надеется. Решение заключается в создании запроса и суммировании всех файлов. Вы можете сделать это с помощью Linq.

using System.Linq;

// Query all files in the folder. Make sure to add the CommonFileQuery
// So that it goes through all sub-folders as well
var folders = ApplicationData.LocalFolder.CreateFileQuery(CommonFileQuery.OrderByName);

// Await the query, then for each file create a new Task which gets the size
var fileSizeTasks = (await folders.GetFilesAsync()).Select(async file => (await file.GetBasicPropertiesAsync()).Size);

// Wait for all of these tasks to complete. WhenAll thankfully returns each result
// as a whole list
var sizes = await Task.WhenAll(fileSizeTasks);

// Sum all of them up. You have to convert it to a long because Sum does not accept ulong.
var folderSize = sizes.Sum(l => (long) l);
7
ответ дан Nate Diamond 26 August 2018 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: