9

我想创建类似应用程序的Dumpster,为此我希望在用户删除任何文件时收到通知,以便我可以将其保存到我的应用程序内存中。

我使用了 File Observer,但它在文件删除后发出通知,而在 marshmallow 中它也没有通知删除。我将此链接称为文件观察者。我在某处读到它可以使用本机编程语言(C),但无法获得任何解决方案。我怎样才能做到这一点?提前致谢。

我试过这个:

@Override
        public void onEvent(int event, String path) {
            if (path == null) {
                return;
            }
            //the monitored file or directory was deleted, monitoring effectively stops
            if ((FileObserver.DELETE_SELF & event)!=0) {
                FileAccessLogStatic.accessLogMsg += absolutePath + "/" + " is deleted\n";
            }       
        }
4

1 回答 1

8

让我们先澄清一下。

  1. Dumpster使用 .trash 目录,该目录可能始终存在,也可能不存在。应该注意的是,Dumpster 在许多设备上都不能正常运行,因为可以通过 google 评论看到。
  2. Dumpster使用(我从代码中猜到它仅用于教育目的)它自己的系统文件Handler使用 aservice来检查onClick事件,如果它是一个文件onClick,它会将它File以及它保存path到一个单独的文件夹(通常是隐藏的)并保存它在一个database地方。如果它被删除,你知道文件在哪里,如果没有,让我们从那个文件中删除该文件hidden folder。好吧,这有点不值得痛苦,因为您几乎需要让您的服务几乎一直运行,这会使用 CPU 资源。它也可以在有根设备上运行,但为什么根设备仅用于此目的。
  3. 随着设备安全性的提高,执行这些任务的可能性越来越小。截至2017 年 1 月 9 日,所有这些文件回收站都对最新的 android 版本有负面评价。因此,证明了我的观点。

    FileObserver使用该概念检查文件甚至目录的任何更改,但您无法影响它,这意味着您无法阻止删除它会在用户删除后通知所有内容。

    inotify.hNDK用于创建应用程序,用于检查文件夹和文件上的事件,但如果提到该文件夹​​,则子子文件夹将不包含在此范围内或通知您文件的任何更改。而且 中使用的概念inotify与 相同FileObserver。您只能在文件被删除后收到通知。inotify 中使用的代码是这样的。

  1. inotify_init通过()创建 inotify 实例。
  2. inotify使用inotify_add_watch() 函数将所有要监视的目录添加到列表中。
  3. 要确定发生的事件,请在 inotify 实例上执行 read()。此读取将被阻止,直到发生更改事件。建议使用select() 调用对此 inotify 实例执行选择性读取。
  4. 读取返回受监视目录上发生的事件列表。根据read() 的返回值,我们就可以确切地知道发生了什么样的变化。
  5. 如果取消对目录/文件的监视,请调用inotify_rm_watch()。

inotify 中存在的两种方法如下:

IN_DELETE- 从监视目录中删除的文件/目录

IN_DELETE_SELF– 监视的文件/目录本身已被删除

两者都与FileObserver

  1. 此解决方案可能无法完全提供帮助,但仍然可以帮助创建任何Dumpster类型的应用程序。可以说你需要创建你自己的File Manager,你可以创建你自己FileV2的扩展的自定义(只是一个很酷的名字文件版本 2.0)类,File你可以根据需要覆盖删除方法(和所有其他方法)。你可以用你自己的文件创建一个custom pop up你想要文件的说法,是的,弹出的不是。(确保用户使用此文件管理器进行删除,否则它将无法正常工作,因为覆盖系统文件删除()也会弄乱其他应用程序)。deletebacking updismissing

    class filev2 extends File {
    
    public filev2(@NonNull String pathname) {
        super(pathname);
    }
    
    public filev2(@NonNull URI uri) {
        super(uri);
    }
    
    @Override
    public boolean delete() {
     //   return super.delete();
    //Do as you want and return the boolean.
    }
    
    }
    

但是,如果用户使用您的文件,请确保您的文件将被保存File Manager。您可以intent-filters为任务设置,以便您参与该FileManager任务ACTION_VIEW

最后但我不确定这也许registerContentObserver也可以使用。(虽然不确定)

资料来源

Inotify.h 帮助网站

registerContentObserver 帮助

类似的问题

FileObserver 帮助

Linux 帮助已删除文件的日志

我希望它有所帮助,我希望你现在可以开始你想要的东西。

于 2017-09-01T15:26:25.063 回答