Простой способ проверить, является ли каталог пустым в WinRT (async API)

Я хотел создать простой IsEmpty(StorageFolder directory) метод, который работает в приложениях WinRT, то есть использует асинхронный API. Я не вижу соответствующего метода в документации для класса StorageFolder, и я также не нашел ничего в моих поисках. Извините, если я пропустил это!

Мне удалось создать следующий метод, который работает:

public static async Task<bool> IsEmpty(StorageFolder directory)
{
    var files = await directory.GetFilesAsync();
    if (files.Count > 0)
    {
        return false;
    }

    var folders = await directory.GetFoldersAsync();
    if (folders.Count > 0)
    {
        return false;
    }

    return true;
}

Но... есть ли более чистый путь? Либо встроенный, либо код, который я мог бы написать... Должно быть легко проверить, является ли каталог пустым, но я знаю, что раньше я сталкивался с проблемами, когда просто пытался проверить, существует ли каталог или файл с использованием асинхронного API WinRT.,

Я также не совсем уверен, получают ли асинхронные вызовы GetFilesAsync и GetFoldersAsync каждый файл / папку в каталоге перед возвратом, или они могут каким-то образом получить только один элемент, прежде чем понять, что Count будет больше 0 (я думаю, ленивой оценки, как в языке Haskell, но это C#...). Если бы они могли, я был бы более мирным с этим методом:)

1 ответ

Решение

StorageFolder. GetItemsAsync(0,1) извлечет первый файл или подпапку:

public static async Task<bool> IsEmpty(StorageFolder directory)
{
    var items = await directory.GetItemsAsync(0,1);
    return items.Count == 0;
}

GetFilesAsync и GetFoldersAsync вернут все файлы или папки. Эти вызовы не знают, что вы будете заботиться только о количестве, и я сомневаюсь, что компилятор достаточно умен, чтобы понять это и переписать вызовы для использования отфильтрованных версий автоматически.

Другие вопросы по тегам