FileSystemWatcher получает старый путь [дубликат]

RxAndroid - еще одна лучшая альтернатива этой проблеме, и это избавляет нас от проблем создания потоков, а затем публикует результаты в потоке пользовательского интерфейса Android. Нам просто нужно указать потоки, по которым должны выполняться задачи, и все обрабатывается внутренне.

Observable<List<String>> musicShowsObservable = Observable.fromCallable(new Callable<List<String>>() { 

  @Override 
  public List<String> call() { 
    return mRestClient.getFavoriteMusicShows(); 
  }
});

mMusicShowSubscription = musicShowsObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<String>>() {

    @Override 
    public void onCompleted() { }

    @Override 
    public void onError(Throwable e) { }

    @Override 
    public void onNext(List<String> musicShows){
        listMusicShows(musicShows);
    }
});
  1. По указанию (Schedulers.io()) RxAndroid будет запускать getFavoriteMusicShows() в другом потоке.
  2. Используя AndroidSchedulers.mainThread(), мы хотим наблюдать это Observable в потоке UI, т. е. хотим, чтобы наш обратный вызов onNext() вызывался в потоке пользовательского интерфейса
4
задан R160K 17 March 2014 в 10:23
поделиться

3 ответа

Задача имеет два недостатка, которые затрудняют реализацию: (a) операция перемещения по дискам на самом деле представляет собой последовательность операций чтения / записи, за которой следует удаление, а не перемещение. И во время этих операций чтения / записи может быть некоторое преобразование данных на месте; и (б) перемещение может выполняться не только оболочкой.

Что вы можете сделать, это использовать драйвер фильтра файловой системы для перехвата операций с файлами сразу, когда они происходят. Затем вам необходимо определить последовательность операций чтения и записи, выполняемых одним и тем же процессом над вашим файлом. То есть если ваш код обнаруживает, что файл читается последовательно (ПРИМЕЧАНИЕ: некоторые инструменты копирования могут считывать файл в нескольких потоках параллельно), а затем записывать аналогичные блоки данных в другой файл И после прочтения всего исходного файла удаляется, а полный содержимое файла было записано на другое место, тогда вы можете догадаться, что вы перешли на операцию перемещения файла.

0
ответ дан Eugene Mayevski 'Allied Bits 3 September 2018 в 16:46
поделиться

Bump & amp; update: Возможно, это противоречит правилам StackOverflow, но я хотел бы указать на многих людей, приземляющихся на этой странице (и на множество похожих вопросов на SO), что я начал запрос функции на MicroSoft UserVoice, чтобы добавить обнаружение MOVE для FileSystemWatcher. Лучшим решением в долгосрочной перспективе, а не попыткой решить эту проблему, может быть заявление MicroSoft о ее исправлении. Если вы пришли сюда, потому что вам тоже нужно решение этой проблемы, рассмотрите щелчок здесь и голосование за эту функцию.

3
ответ дан R160K 3 September 2018 в 16:46
поделиться

Использование высокоуровневого неограниченного api, предоставленного C #, - нет, вы не можете. Использовать FileSystemWatcher .. На том же самом приводе движущегося файла не «удалить и создать» - это «переименовать».

Если вы можете / хотите перейти на нижний уровень, тогда вы можете переместить MoveItem и MoveItems интерфейса оболочки IFileOperation и MoveFile от Kernel32.dll ... Он будет работать с большинством приложений, но требует расширения для обеспечения безопасности вашего приложения, что в большинстве случаев неприемлемо в корпоративной среде ..

0
ответ дан rufanov 3 September 2018 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: