Цель: получить список файлов изображений из указанной пользователем папки и получить метаданные широты / долготы для каждого файла, если он доступен.
Подход состоит в том, чтобы использовать запрос к папке с параметрами для возврата списка файлов.которые затем повторяются, чтобы получить информацию о геотеге.В качестве простого теста я просто добавил код в пример 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 или делает что-то нежелательное?