none
监控指定文件夹 RRS feed

  • 问题

  • Dear All:

        项目需要监控指定文件夹内文件添加、删除、改变 (使用javascript)。我大概知道要使用storageFileQueryResult的contentChanged 事件。

        测试code如下:

    var fileQuery = null;
    
    function init() {
        Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.getFolderAsync(entry.token).then(function (folder) {
            fileQuery = folder.createFileQuery();
            fileQuery.getFilesAsync().then(function (files) {
                ...
                ...
                // 项目初始化时,记录指定文件夹所有文件
            }).then(function () {
                fileQuery.addEventListener("contentschanged", contentChanged);
            });
        }, function (error) {
        });
    }
    
    function contentChanged(eventObject) {
        var entry = Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.entries[0];
        Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.getFolderAsync(entry.token).then(function (folder) {
            // Set the event handler of media folder content changed
            fileQuery = folder.createFileQuery();
            fileQuery.getFilesAsync().then(function (files) {
                ...
                ...
                // 检测到文件夹内文件变化后,重新获取指定文件夹内文件,以便与之前的记录做比较
            }).then(function () {
                fileQuery.addEventListener("contentschanged", contentChanged);
            });
        });
    };
    

    现在有两个问题:

    1. contentschanged 事件触发随机。。。尤其是文件改动数目比较多的时候,比如删除200个文件,很多时候不会进入contentChanged 函数。但文件数比较少的时候基本是能触发的。。。(很困惑,也找不到什么相关例子)。

    2. 我是否必需在contentChanged处理函数内重新设置fileQuery,以便时时监控。因为在contentChanged处理函数内我需要获得当前最新的文件状态,要getFilesAsync()。。当然也可以不用重新给fileQuery赋值,直接使用folder来getFilesAsync()。。。可是我试验过,貌似只能监控到一次改变(不知道是否与第一个问题有关,触发contentChanged事件变得随机。。)。

    我不太确定时候需要这样做,自己试过的结果也不能确定,都是有时检测到,有时检测不到。。。我也不清楚哪里用的对,哪里用的不对。。。当然,我觉得应该不会与文件数量有关吧,但删除文件多了,不会触发事件的几率还是挺多的。

    请教高手指点,谢谢···

     Nick

    2012年11月20日 6:47

答案

全部回复

  • 感觉又发现一个新的问题:当项目启动后马上对文件夹内文件进行修改,contentschanged事件会被触发,任务管理器中Runtime Broker进程会占用很多内存(不知道和contentschanged是否有关)。但如果项目启动后不直接进行对文件夹内文件的修改,大约1分钟后再对这个文件夹内文件修改,contentschanged事件则不会被触发。。。我也不知道发生了什么会这样子。。求助。。

    多谢各种帮助

    2012年11月20日 9:46
  • 昨天发现一个问题,貌似在project中任何一处对这个指定的文件夹做getFilesAsync时,都要重新对fileQuery重新注册事件,貌似对所有的getFilesAsync操作的fileQuery都只能是同一个变量。不知道是不是要这样。


    • 已编辑 UOW_Nick 2012年11月22日 1:36
    2012年11月22日 1:22
  • For StorageFolderQueryResult.ContentsChanged:

    Is there any usage limitation that only need to call GetFilesAsync at least once? If I got the query of a specified folder, and I want to use such event to monitor the specified folder during the App run. Also, maybe I need to call GetFilesAsync within the event handler function for comparing what files were added or deleted, or modified etc. So, is it essential that I should reset the query variable to call GetFilesAsync? If not, the event would be available or not? ...

    Besides, maybe my project requires to reset the query with other options...Is there anything else to do?...

    confused...

    2012年11月22日 8:31
  • Hi,

    感觉这个是事件实现机制的问题,这个参考:

    http://msdn.microsoft.com/en-US/library/windows/apps/windows.storage.search.storagefolderqueryresult.contentschanged

    不过里面说了挂起是没有办法触发的,你文件怎么修改的呢?

    因为看不到这个的实现代码所以具体问题也没有办法解决。我个人推测应该是内存的问题,将所有文件都读入消耗大量内存,但是也方便了这个事件的触发,几分钟以后可能会有一部分被调出内存,所以也实现不了,你试试using{}好不好用,或者js里相同功能的。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 UOW_Nick 2012年11月27日 2:07
    2012年11月23日 7:00
    版主
  • 谢谢Aaron ^_^

    我再多做下测试

    2012年11月23日 9:08