Сбой GetGeotagAsync для файлов из списка, созданного с помощью Folder.CreateFileQueryWithOptions w / OrderByName - PullRequest
0 голосов
/ 26 сентября 2018

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

Подход состоит в том, чтобы использовать запрос к папке с параметрами для возврата списка файлов.которые затем повторяются, чтобы получить информацию о геотеге.В качестве простого теста я просто добавил код в пример Geotag, предоставленный MS;Выберите методFolderButton_Click.Он использует FolderPicker, а затем просто выбирает первый файл из запроса (просто как тест) и обрабатывает его так же, как исходная демонстрация, для отображения информации о геотегах.

Проблема, как представляется, заключается в том, как элементы StorageFile возвращаются иззапрос И только при использовании CommonFileQuery.OrderByName.Если используется DefaultQuery, то все работает.

Вот код, добавленный в геотег MS Samples (кнопка была добавлена ​​в XAML):

private async void ChooseFolderButton_Click()
{
    FolderPicker picker = new FolderPicker
    {
        SuggestedStartLocation = PickerLocationId.PicturesLibrary,
        CommitButtonText = "Select",
        ViewMode = PickerViewMode.Thumbnail,
    };
    picker.FileTypeFilter.Add("*");
    StorageFolder Folder = await picker.PickSingleFolderAsync();

    if (Folder != null) { 
        // Get the files and sort them myself
        IReadOnlyList<StorageFile> files = await Folder.GetFilesAsync();
        List<StorageFile> sortedList = files.Where(f => string.Compare(f.FileType,".jpg", ignoreCase: true) == 0 )
                                                .OrderBy(f => f.DisplayName)
                                                .Select(f => f)
                                                .ToList();
        file = sortedList.FirstOrDefault();
    }

    if (Folder != null) {
        // Use Folder GetFiles with query options to get sorted list
        var queryOptions = new QueryOptions(CommonFileQuery.DefaultQuery, new List<string> { ".jpg" })
        {
            FolderDepth = FolderDepth.Shallow
        };
            //queryOptions.SetPropertyPrefetch(PropertyPrefetchOptions.ImageProperties, null);
        IReadOnlyList<StorageFile> files2 = await Folder.CreateFileQueryWithOptions(queryOptions).GetFilesAsync();
        var file2 = files2[0];
    }

    if (Folder != null && file != null)
    {
        FileDisplayName.Text = file.DisplayName;
        FileOperationsPanel.Visibility = Visibility.Visible;
    }
    else
    {
        FileOperationsPanel.Visibility = Visibility.Collapsed;
    }
}

Выбор файла из sortedList работает нормально.Использование результата из файлов2 также будет работать при использовании DefaultQuery, как показано.Измените его на OrderByName, и вызов GetGeotagAsync завершится неудачно, вернув значение null.

Если рассмотреть это подробно, кажется, что возвращенный экземпляр StorageFile отличается в этом последнем случае.FolderRelativeId имеет дубликат расширения файла;numbers \ filename.ext.ext;однако, доступ через экземпляр StorageFile, кажется, работает иначе ... за исключением GetGeotagAsync () как минимум.Это заставляет меня задаться вопросом, создается ли копия файлов, а метаданные не включены.

Я относительно новичок в C # и UWP, и это мой первый пост с вопросом, поэтому я надеюсь, что это достаточно подробно ..Вопрос в основном: я что-то здесь упускаю?Что-то не так в запросе к папке?Я могу обойти это с помощью linq, как я делал в примере кода, или даже просто использовать DefaultQuery;но это неудобно, так как я использую подход с запросом папки в нескольких других вещах.Дублирует ли запрос OrderByName или делает что-то нежелательное?

1 Ответ

0 голосов
/ 26 сентября 2018

Я предполагаю, что эти полученные файлы будут отображаться в пользовательском интерфейсе, в этом случае вы можете использовать отличный AdvancedCollectionView , который является частью Windows Community Toolkit.

AdvancedCollectionViewобеспечивает постоянную сортировку, а также фильтрацию содержащихся элементов по их свойствам, что делает его невероятно полезным для современных приложений с интенсивным связыванием.

Вот пример:

List<StorageFile> FileList = New List<StorageFile>();

Microsoft.Toolkit.Uwp.UI.AdvancedCollectionView ObservableFileList
        {
            get; set;
        }




void InitializeList(){

//here we pass the backing list as an argument, 
//any changes on the filelist will be directly reflected on our new observablelist, and vice versa

ObservableFileList = new Microsoft.Toolkit.Uwp.UI.AdvancedCollectionView(FileList);

//here we add sorting definitions, 
//"DisplayName" is the current property we choose to sort against

ObservableFileList.SortDescriptions.Add(new SortDescription("DisplayName",SortDirection.Descending)); 

}


void AcquireNewDataSet(){    
//GetFiles should return your files with no particular order.    
List<StorageFile>tmp = GetFiles();    

//always prefer ReplaceRange
FileList.ReplaceRange(tmp);    
}

после этого ваш наблюдаемый список всегда будет отсортирован по алфавиту, даже если он используется как ItemSource в различных контейнерах элементов пользовательского интерфейса

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