Простой способ проверить, пуст ли каталог в 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 # ...). Если бы могли, то меня бы больше устроил этот метод :)


person CanisLupus    schedule 29.11.2014    source источник
comment
ссылка, рассматриваемая как возможный дубликат, связана с старый API, который я не могу использовать в WinRT. Он должен использовать асинхронные методы, предоставляемые новым API.   -  person CanisLupus    schedule 29.11.2014
comment
Вас волнует, существуют ли какие-либо вложенные папки или есть вложенные пустые каталоги, которые считаются пустыми?   -  person Yuval Itzchakov    schedule 29.11.2014
comment
Как и в созданном мной методе, вызов IsEmpty над каталогом должен возвращать true, если внутри него нет папок или файлов. Если внутри находится папка, она не пуста, даже если сама папка пуста.   -  person CanisLupus    schedule 30.11.2014
comment
Если вам нужна неглубокая копия, это должно работать нормально. Это не является излишним, поскольку вы возвращаете список только для чтения, который описывает файл / папку, но не открывает его дескриптор.   -  person Yuval Itzchakov    schedule 30.11.2014
comment
Спасибо за вашу помощь. Я понимаю это, но это все еще кажется ... слишком большим. Даже если возвращенный список доступен только для чтения, GetFilesAsync / GetFoldersAsync все равно должен создать его полностью, верно? Если папка содержит 1000 файлов, будет создан список из 1000 элементов, только чтобы затем проверить, больше ли счетчик, чем ноль. То же для 1000 папок.   -  person CanisLupus    schedule 30.11.2014
comment
Опять же, я предполагаю, что если не существует собственного метода, было бы невозможно сделать это лучше. Я посмотрю, найдет ли кто-нибудь лучший метод. Если нет, я, вероятно, приму тот факт, что этого достаточно.   -  person CanisLupus    schedule 30.11.2014
comment
Я попробую поискать, найду ли что-нибудь.   -  person Yuval Itzchakov    schedule 30.11.2014


Ответы (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 вернут все файлы или папки. Эти вызовы не знают, что вы будете заботиться только о счетчике, и я сомневаюсь, что компилятор достаточно умен, чтобы понять это и переписать вызовы для автоматического использования отфильтрованных версий.

person Rob Caplan - MSFT    schedule 30.11.2014
comment
Ха! Это больше походит на это. Я тоже так думал о поведении этих методов. В моем вопросе было выдано желаемое за действительное :) - person CanisLupus; 30.11.2014
comment
Если вам нужно иметь дело только с местоположениями без посредников (вашими личными каталогами), это нормально. Если вам нужно проверить посреднические местоположения (например, библиотеку изображений), это не надежно, поскольку API хранилища не возвращают скрытые или системные файлы (и вы также не можете использовать API Win32 для этих местоположений). - person Peter Torr - MSFT; 04.12.2014