Я пытаюсь сохранить базу данных в синхронизации с музыкальной библиотекой Windows 8, и я еще не нашел эффективного решения для этого. Я знаю, что .NET имеет FileSystemWatcher
, который недоступен для приложений Windows 8. В настоящее время, моя идея состоит в том, чтобы сравнить список файлов, возвращенных GetFilesAsync
, против моей базы данных и проверить, было ли что-то изменено, удалено или добавлено. Я знаю, что это не идеально, но я не могу найти другую полезную вещь в Windows.Storage
. Моя проблема в том, что я хочу сделать эти обновления автоматически после внесения изменений в музыкальную библиотеку. Проверка ModifiedDate
папок бесполезна, когда изменения происходят в подпапках. Кто-нибудь знает, есть ли способ сказать, когда был изменен StorageFolder
?Идентификация файлов в StorageFolder
ответ
Я не думаю, что вы можете получить эту информацию из своего приложения Windows 8. Лучше всего асинхронно запрашивать папки и файлы и сравнивать информацию с информацией, хранящейся в базе данных. См. Один пример перечисления папок и файлов here. Я знаю, что это не очень эффективно для того, что вы пытаетесь сделать. Если вы найдете какие-либо другие способы, пожалуйста, поделитесь.
Вы можете использовать StorageFileQueryResult
и его ContentsChanged
событие, которое будет уведомлено об изменениях в папке и ее подпапках. Однако событие не содержит никакой информации о том, что фактически изменилось, поэтому вам нужно повторно проанализировать папку и проверить, было ли что-то, что вас интересует, было изменено.
Это работает для меня:
public async void ListenAsync() {
query = storageFolder.CreateFileQuery();
query.ContentsChanged += query_ContentsChanged;
var files = await query.GetFilesAsync();
}
void query_ContentsChanged(IStorageQueryResultBase sender, object args) {
// args has no info about what changed. check manually
}
Если вы в состоянии получить ContentsChanged
надежно срабатывала, то ниже код может помочь вам определить, что изменилось.
Обратите внимание, что это не быстро. GetBasicPropertiesAsync
, кажется, занимает ~ 5 мс/файл ... так ~ 10 секунд, чтобы разбить набор из 1000 файлов.
(я не могу ContentsChanged
надежно срабатывал, и, после нескольких часов прибегая к помощи, оказывается, многие другие имеют те же проблемы)
private class DiffSet
{
public IReadOnlyList<StorageFile> Added { get; set; }
public IReadOnlyList<StorageFile> Deleted { get; set; }
public IReadOnlyList<StorageFile> Changed { get; set; }
}
private static async Task<DiffSet> Diff(IEnumerable<StorageFile> oldSet, IEnumerable<StorageFile> newSet)
{
var newAsDict = newSet.ToDictionary(sf => sf.Path);
var added = new List<StorageFile>();
var deleted = new List<StorageFile>();
var changed = new List<StorageFile>();
var fromOldSet = new HashSet<string>();
foreach (var oldFile in oldSet)
{
if (!newAsDict.ContainsKey(oldFile.Path))
{
deleted.Add(oldFile);
continue;
}
var oldBasicProperties = await oldFile.GetBasicPropertiesAsync();
var newBasicProperties = await newAsDict[oldFile.Path].GetBasicPropertiesAsync();
var oldDateModified = oldBasicProperties.DateModified;
var newDateModified = newBasicProperties.DateModified;
if (oldDateModified != newDateModified)
{
changed.Add(oldFile);
}
fromOldSet.Add(oldFile.Path);
}
foreach (var newFile in newSet)
{
if (!fromOldSet.Contains(newFile.Path))
added.Add(newFile);
}
return new DiffSet
{
Added = added,
Deleted = deleted,
Changed = changed
};
}
- 1. Получение количества файлов в StorageFolder
- 2. Получить список файлов в storagefolder в listview
- 3. Идентификация файлов в NSIS
- 4. Как сохранить StorageFolder
- 5. StorageFolder найти скрытые файлы
- 6. Идентификация временных файлов Microsoft Office
- 7. Идентификация файлов для исправления/исправления
- 8. Идентификация различных форматов файлов Excel
- 9. Идентификация файлов freemarker из браузера
- 10. Как связать элемент управления Gridview с StorageFolder
- 11. Идентификация коммитов, введших множество файлов
- 12. Идентификация неиспользуемых файлов сценариев JS в проекте
- 13. PHP - Идентификация каталогов и файлов в FTP
- 14. cvs checkin: Идентификация имен файлов, указанных в
- 15. Идентификация ассоциации файлов jar в диспетчере задач
- 16. Как сохранить папку из FolderPicker в StorageFolder?
- 17. UWP Невозможно преобразовать из StorageFolder в StorageFile
- 18. Идентификация повторяющихся файлов из числа ведущих символов
- 19. Идентификация каждого поля при загрузке нескольких файлов
- 20. Идентификация «undefined» в JavaScript
- 21. Идентификация повторяющихся файлов на основе содержимого данных в SSIS
- 22. Идентификация обработчиков процессов и блокировок файлов в управляемом коде
- 23. Идентификация типа файла в Java
- 24. Идентификация местоположения файла в informatica
- 25. Как узнать, был ли файл уже создан в StorageFolder
- 26. В метро, какая разница между FolderInformation и StorageFolder
- 27. Как добавить файлы в «StorageFolder» во время разработки?
- 28. Идентификация изображений разведчика DICOM
- 29. Идентификация дубликатов в CouchDB
- 30. идентификация цветов в javaCV
Тристан, я знаю, что это старый пост, но вы когда-нибудь фигура как сделать огонь 'ContentsChanged' надежным? – Laith
Желаю. Я закончил писать резервный кэш чтения SQLite, чтобы поддерживать знание файловой системы, включая кусок, который с низким приоритетом проверяет все известные файлы. – Tristan