2013-03-22 2 views
3

Я пытаюсь сохранить базу данных в синхронизации с музыкальной библиотекой Windows 8, и я еще не нашел эффективного решения для этого. Я знаю, что .NET имеет FileSystemWatcher, который недоступен для приложений Windows 8. В настоящее время, моя идея состоит в том, чтобы сравнить список файлов, возвращенных GetFilesAsync, против моей базы данных и проверить, было ли что-то изменено, удалено или добавлено. Я знаю, что это не идеально, но я не могу найти другую полезную вещь в Windows.Storage. Моя проблема в том, что я хочу сделать эти обновления автоматически после внесения изменений в музыкальную библиотеку. Проверка ModifiedDate папок бесполезна, когда изменения происходят в подпапках. Кто-нибудь знает, есть ли способ сказать, когда был изменен StorageFolder?Идентификация файлов в StorageFolder

ответ

0

Я не думаю, что вы можете получить эту информацию из своего приложения Windows 8. Лучше всего асинхронно запрашивать папки и файлы и сравнивать информацию с информацией, хранящейся в базе данных. См. Один пример перечисления папок и файлов here. Я знаю, что это не очень эффективно для того, что вы пытаетесь сделать. Если вы найдете какие-либо другие способы, пожалуйста, поделитесь.

0

Вы можете использовать StorageFileQueryResult и его ContentsChanged событие, которое будет уведомлено об изменениях в папке и ее подпапках. Однако событие не содержит никакой информации о том, что фактически изменилось, поэтому вам нужно повторно проанализировать папку и проверить, было ли что-то, что вас интересует, было изменено.

0

Это работает для меня:

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 
    } 
1

Если вы в состоянии получить 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 
     }; 
    } 
+0

Тристан, я знаю, что это старый пост, но вы когда-нибудь фигура как сделать огонь 'ContentsChanged' надежным? – Laith

+0

Желаю. Я закончил писать резервный кэш чтения SQLite, чтобы поддерживать знание файловой системы, включая кусок, который с низким приоритетом проверяет все известные файлы. – Tristan

Смежные вопросы