Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сводка
- Дополнительные свойства позволяют приложениям тегировать файлы с свойствами без изменения файла.
- Полезно для случаев, когда у вас есть свойства, которые трудно вычислять, или файл не может быть изменен
- Использование дополнительных свойств аналогично использованию любого другого свойства в системе свойств Windows
Введение
Многие из захватывающих новых приложений за последние несколько лет требуют выполнения интенсивных операций ЦП с пользовательскими файлами для извлечения полезных свойств из файлов, отличных от основных вещей, таких как дата создания. Эти приложения выполняют распознавание объектов в изображениях, извлечении намерений в сообщениях электронной почты и анализе текста для группирования документов вместе. Это зависит от того, насколько мощные вычисления теперь доступны на большинстве потребительских компьютеров.
Благодаря мгновенному поиску этих метаданных пользователи могут быть экспоненциально более продуктивными. Знать, что ваша дочь изображена на фотографии, является интересным, но возможность искать фотографию её с бабушкой гораздо полезнее. Это делает использование компьютера более личным и живым. Как если бы кто-то в машине протягивал руку, чтобы помочь вам найти ваши драгоценные воспоминания.
В течение десятилетий решение для быстрого поиска в Windows было индексатором, и в Creators Update он был обновлен для поддержки этих новых сценариев. Теперь приложения могут помечать файлы с дополнительными свойствами за пределами тех, которые извлекаются системой. Эти свойства рассматриваются как первоклассные
Свойства Windows
Система свойств Windows была ключевой частью взаимодействия с файлами в течение многих лет. Это позволяет приложениям считывать свойства из файлов без необходимости понимать внутренние компоненты всех различных форматов файлов или языков, в которых может находиться файл. Всё сложное абстрагировано для вас как для разработчика; вам всего лишь нужно запросить список и указать порядок: по возрастанию или убыванию.
Система свойств переплетается с индексатором Windows. Он считывает все свойства из файлов в пределах области и сохраняет их. Позже, когда приложение запрашивает список всех .docx в папке, которые будут отсортированы по дате изменения за исключением файлов, созданных Джоном Смитом, индексатор может мгновенно вернуть список.
Недостатком того, как эти системы взаимодействуют, является то, что индексатор требует, чтобы все свойства, которые он должен хранить о файле, были доступны мгновенно. Это не позволяет ему узнать о более интересных свойствах, на вычисление которых требуется больше времени, так как существует жесткое временное ограничение.
Использовать свойства очень просто. Приложение может запросить отсортированный набор свойств о файле, как при работе с базой данных, или же передать запрос, как в поисковой системе. Индексатор обрабатывает запрос и возвращает результаты. Благодаря этому разработчики могут сочетать свои фильтры (например, только поиск файлов jpg) с запросом пользователя (именем файла, начиная с "bird").
Дополнительные свойства
Дополнительные свойства ведут себя идентично обычным свойствам Windows с одной очень важной разницей — они не будут записываться при добавлении файла в индексатор. Дополнительное свойство должно быть добавлено другим приложением в системе позже. Это может быть через две минуты позже, когда распознавание объектов завершится или может быть через несколько дней.
После записи свойства его можно искать, фильтровать, отсортировать или сгруппировать так же, как и любое другое свойство в системе. Кроме того, его можно использовать в объединенных запросах с другими свойствами в системе, дополнительными и не только. Это позволяет легко сочетать дополнительные свойства с существующим кодом файловой системы, не выполняя перезапись.
Примеры сценариев
Есть тысячи различных свойств, которые можно добавить в дополнительное свойство, но есть несколько ключевых сценариев, к которым это руководство будет возвращаться.
Добавление тегов к рисункам с извлеченными свойствами
Эти приложения могут использовать обученную модель машинного обучения для извлечения особенностей из изображения, о которых система не знает, таких как объекты на изображении. Затем он может принимать объекты, которые он определяет в изображении, и добавлять их в систему свойств для последующего поиска или группировки.
Пометка файлов с указанным идентификатором приложения
Многие приложения синхронизации файлов используют собственный уникальный идентификатор для отслеживания файлов при перемещении между сервером и различными клиентскими устройствами. Клиент синхронизации может записать этот идентификатор в систему свойств, не влияя на файл. Этот идентификатор теперь доступен приложению позже для быстрого доступа и доступен для любого другого приложения в системе для чтения при взаимодействии с поставщиком синхронизации.
Существует множество других вариантов использования дополнительных свойств, но оба служат хорошими примерами, так как они требуют быстрого поиска, являются частями информации, о которых система не знает, и не могут быть добавлены в сам файл.
Использование дополнительных свойств
Использование дополнительных свойств совпадает с записью обычного свойства в файловую систему. Если вы хорошо разбираетесь в StorageFiles и свойствах, можете это пропустить. В противном случае давайте рассмотрим краткий пример записи одного свойства в файл, а затем чтение того же свойства позже.
Написание дополнительных свойств
Пример изменит только первый файл, который он находит для простоты, но обычно приложение добавит свойство в каждый найденный файл.
// Only indexed jpg files are going to be used
QueryOptions option = new QueryOptions(CommonFileQuery.DefaultQuery, new string[] { ".jpg" });
option.IndexerOption = IndexerOption.OnlyUseIndexer;
// Typically an app would loop over all the files in the library, updating them all with the new
// value. To make the sample easier to understand however, this app is only going to update the
// first file it finds
var query = KnownFolders.PicturesLibrary.CreateFileQueryWithOptions(option);
StorageFile file = (await query.GetFilesAsync()).FirstOrDefault();
if (file == null)
{
log("No jpg file found in the library. Stopping");
return;
}
log("Found file: " + file.Path);
// Selecting the property to modify and writing it out
List<KeyValuePair<string, object>> props = new List<KeyValuePair<string, object>>();
props.Add(new KeyValuePair<string, object>("System.Supplemental.ResourceId", fileId));
await file.Properties.SavePropertiesAsync(props);
Важно проверить, индексируется ли расположение перед записью свойства. В этом примере мы используем параметры запроса для фильтрации исключительно индексированных расположений. Если это невозможно, можно проверить индексированное состояние родительской папки (file.GetParentAsync().GetIndexedStateAsync()). Любой способ даст одинаковые результаты
Чтение дополнительных свойств
Опять же, чтение дополнительного свойства совпадает с чтением любого другого свойства файловой системы. В этом примере приложение будет читать только одно свойство из файла, для него уже есть StorageFile, но оно также может читать другие свойства одновременно.
// An object to hold the result from the indexer, and a string to store
// the value in once we have confirmed it is valid.
object uncheckedResourceId;
string resourceId = "";
// Fetching the key value pair from the indexer
IDictionary<string,object> returnedProps =
await file.Properties.RetrievePropertiesAsync(new string[] { "System.Supplemental.ResourceId" });
if (returnedProps.TryGetValue("System.Supplemental.ResourceId", out uncheckedResourceId))
{
if (uncheckedResourceId != null && !String.IsNullOrEmpty(uncheckedResourceId.ToString()))
{
resourceId = uncheckedResourceId.ToString();
}
}
Проводится проверка, чтобы убедиться, что возвращаемое из системы свойств значение соответствует вашим ожиданиям. Хотя это маловероятно, возможно, что значение было обнулено после его записи вашим приложением. Это подробно описано ниже.
Заметки о реализации
Существует несколько тонких решений, принятых при проектировании дополнительных свойств. Чтобы помочь в реализации, следующие разделы были скопированы из спецификации проектирования для этой функции. Они предоставляют представление о том, как была разработана функция, и почему некоторые из ограничений существуют.
Доступные дополнительные свойства
Изначально для приложений доступно только два свойства: System.Supplemental.ResourceId и System.Supplemental.AlbumID. Если требуется больше, их можно добавить. Идентификатор альбома — это строка с несколькими значениями, которую можно использовать для многих различных приложений, и ResourceId используется в качестве уникального идентификатора для поставщиков облачной синхронизации.
Поддержка файловой системы
Так как форматированный съемный носитель FAT является важным сценарием, дополнительные свойства поддерживают диски FAT и NTFS. Это обеспечит доступность дополнительных свойств для всех пользователей независимо от типа устройства.
Неиндексированные расположения
На рабочем столе есть несколько папок, которые не индексируются. В таких случаях приложения могут по-прежнему иметь доступ к дополнительным свойствам. Однако дополнительные свойства недоступны за пределами индексированных расположений. Этот компромисс был сделан по нескольким причинам:
По умолчанию индексируются все библиотеки и расположения облачного хранилища.
Это расположения, которые в основном используются приложениями UWP. Существуют другие расположения, которые не индексируются (системные или сетевые диски), но они реже используются для хранения пользовательских данных.Структура поверхности API WinRT предполагает, что индексатор почти всегда доступен.
Таким образом, индексатор уже доступен в большинстве мест, которые интересуют приложения для работы с локациями. Если пользователи будут хранить данные в неиндексированных расположениях, проще всего добавить это расположение в индекс. Затем заработают дополнительные свойства, процесс перечисления ускорится, и приложения смогут отслеживать изменения местоположения.
Чтение или запись дополнительных свойств из файла в неиндексированном расположении
Если приложение пытается записать дополнительное свойство в место, которое не является индексированным в данный момент, то вызов API выбросит исключение. Это будет то же исключение, которое возникает при попытке обновить System.Music.AlbumArtist в файле .docx (Недопустимые аргументы).
Уведомления об изменениях:
Уведомления об изменениях UWP и отслеживание изменений будут продолжать работать для дополнительных свойств так же, как и для стандартных свойств. Это позволит приложениям, предоставляющим данные для отслеживания всех изменений, происходящих в одном из своих приложений.
Аннулирование свойств:
Дополнительные свойства файла могут стать устаревшими при изменении или перемещении файла в систему. Приложения, отправляющие данные, будут теми, которые содержат информацию о том, являются ли данные допустимыми или должны быть обновлены, поэтому система просто предоставит средства для их самостоятельного определения.
В случае изменения файла, но не перемещенного или переименованного, все дополнительные свойства файла останутся неизменными. Приложения смогут зарегистрировать уведомления об изменениях с помощью существующей поверхности API и обновить свойства по мере необходимости.
Если файл перемещается, свойства будут недействительными. Приложение получит уведомления об изменениях, касающихся удаления, создания, переименования или перемещения, в зависимости от того, как выполняется операция. После получения уведомления об изменении приложение сможет проверить файл и обновить дополнительные свойства файла по мере необходимости.
Индексатор перестраивается
Иногда системный индекс должен быть перестроен по одной из некоторых причин: схема свойств может измениться, пользователь может включить EDP или просто файл базы данных может быть поврежден. В таких случаях дополнительные свойства не будут сохранены. Мы рассматривали возможность выполнения работы, чтобы попытаться сохранить вспомогательные свойства при перестроении индекса, но было несколько крупных препятствий:
Защита данных
В случае, когда файл базы данных поврежден либо ошибками диска, либо изгоем программным обеспечением, невозможно защитить данные, хранящиеся в этом файле. Он должен храниться в другом месте в системе или каким-то образом изолирован от остальной части базы данных.
Так как мы уже делаем много работы, чтобы сделать индекс менее подверженным повреждению, это, в конечном итоге, приведет к снижению частоты возникновения данной проблемы.
Поддержание сопоставления между файлами и их метаданными во время перестроения
Даже если индекс может защитить данные во время перестроения, невозможно узнать, изменился ли файл во время перестроения индекса. Данные, защищенные индексом от файла, могут быть недействительными, если файл изменен или перемещен.
Поведение
В случае перестроения индексатора все дополнительные данные будут потеряны. Приложения будут отвечать за возврат данных в индексатор, который был потерян во время перестроения. Это создает дополнительную нагрузку на приложения, однако считается разумным, так как они всегда будут поддерживать основное состояние всех данных.
Восстановление
После того как приложения заметят, что индекс перестраивается, они будут отвечать за обновление дополнительных свойств, когда им будет удобно.
Конфиденциальность
Некоторые свойства, которые могут быть записаны в файлы, могут оказаться такими, что пользователи не захотят делиться ими с другими приложениями. Приложения должны иметь возможность указывать, что сведения, которые они записывают в свойства, будут частными для своих приложений, совместно используемыми только с несколькими другими приложениями или общедоступными для каждого приложения в системе.
Хотя это потенциально интересная функция для некоторых ранних пользователей функции, они считают, что получение общедоступных свойств по-прежнему принесет большую ценность дизайну. Таким образом, это отмечено как желаемая характеристика, и мы должны продолжать разрабатывать функцию без возможности скрыть значения, если это потребуется. Добавив его позже, откроется больше сценариев, поэтому это важно учитывать при разработке любых дизайнов.
Выводы
Это так, дополнительные свойства — это простой способ хранения дополнительных свойств файлов в системе. Использование этих функций, конечно, необязательно, но оно может дать вашему приложению преимущество над другими приложениями, которые не могут сортировать и искать данные так быстро.
Мы с нетерпением ждем, чтобы приложения начали использовать эти свойства. Если у вас есть вопросы о том, как использовать заголовок, сообщите нам в комментариях ниже