Если размер файла равен 0 КБ, он не отображается в сетке и файл удаляется - PullRequest
0 голосов
/ 05 июля 2018

У меня есть сетка, которая отображает некоторые файлы. Я хотел бы, если размер файла составляет 0 КБ, то файл не отображается и удаляется, в то время как другие файлы по-прежнему отображаются Код:

StorageFolder cover = await komik.GetFolderAsync("cover");
foreach (StorageFile file in sortedfiles)
{
    bool bukuada = true;
    Buku buku = new Buku();
    buku.Judul = file.DisplayName.ToString();
    BasicProperties pro = await file.GetBasicPropertiesAsync();
    if (pro.Size != 0)
    {
        StorageFile thumbFile = file;
        try
        {
            thumbFile = await cover.GetFileAsync(file.DisplayName.ToString() + ".jpg");
            BitmapImage bi = new BitmapImage();
            bi.SetSource(await thumbFile.OpenAsync(FileAccessMode.Read));
            buku.Cover = bi;

            datasource.Add(buku);
            loading.IsActive = false;
            this.itemGridView.ItemsSource = datasource;
        }
        catch
        {

        }
    }
}

Если я использую приведенный выше код, то, если есть файл, размер которого равен 0 КБ, то все файлы не отображаются. Как получить только файлы размером 0 КБ, которые не отображаются и не удаляются, а другие все еще отображаются?

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Для вас было установлено this.itemGridView.ItemsSource = datasource;, когда pro.Size != 0

Попробуйте использовать этот код.

StorageFolder cover = await komik.GetFolderAsync("cover");
List<StorageFile> deletedFileList = new List<StorageFile>();
foreach (StorageFile file in sortedfiles)
{
    bool bukuada = true;
    Buku buku = new Buku();
    buku.Judul = file.DisplayName.ToString();
    BasicProperties pro = await file.GetBasicPropertiesAsync();
    if (pro.Size != 0)
    {
        StorageFile thumbFile = file;
        try
        {
            thumbFile = await cover.GetFileAsync(file.DisplayName.ToString() + ".jpg");
            BitmapImage bi = new BitmapImage();
            bi.SetSource(await thumbFile.OpenAsync(FileAccessMode.Read));
            buku.Cover = bi;

            datasource.Add(buku);
            loading.IsActive = false;           
        }
        catch
        {

        }
    }
    else
    {
        deletedFileList.Add(file);
    }
}

// display the data source.
 this.itemGridView.ItemsSource = datasource;

 // delete the file
    foreach(var temp in deletedFileList)
    {
        try
        {
            await temp.DeleteAsync();
        }
        catch(IOException)
        {

        }
    }
0 голосов
/ 05 июля 2018

Ваш код многократно устанавливает ItemsSource в цикле, что менее эффективно, но в остальном не должно влиять на результат - даже если есть некоторые файлы размером 0, они должны быть пропущены, а "фактические" файлы должны вызвать обновление datasource.

Меня беспокоит следующее:

thumbFile = await cover.GetFileAsync(file.DisplayName.ToString() + ".jpg");

Известно, что свойство DisplayName иногда возвращает имя файла , включая расширение. Я бы скорее предложил использовать следующее:

thumbFile = await cover.GetFileAsync( Path.GetFileNameWithoutExtension( file.Name ) + ".jpg" );
Свойство

Name возвращает полное имя файла, поэтому, если мы применим Path.GetFileNameWithoutExtension, расширение обязательно будет удалено, так что результат будет таким, как вы хотите.

Если это не поможет, измените выражение catch на catch ( Exception ex ), а затем поместите точку останова в блок catch, потому что, если переменная datasource не заполнена данными, должна быть исключение происходит заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...