none
菜鸟求教一个关于进度条问题 RRS feed

  • 问题

  • 我用一个filesystemwatcher监控一个目录,当目录中少个文件,ProgressBar的进度条往前走一段,直到文件数量为0,进度条100。这时问题级出来了,我写的问题代码如下:
           private void fsw_Delete(object sender, FileSystemEventArgs e)
            {
                int flsum = Directory.GetFiles(path.ToString()).Length;
                Thread pThread = new Thread(new ParameterizedThreadStart(SetProcess));
                pThread.Start((object)flsum);
            }
    		
            public void SetProcess(object fltemp)
            {
                int fls = Convert.ToInt32(fltemp);
                int fl = Directory.GetFiles(path1.ToString()).Length;
                int pro = (fls - fl) / fls * 100;
                this.SetProBar(pro);//设置进度条
            }
    因为每一次filesystemwatcher监控到目录变化后,传递flsum变化了,这时调用的进程中的fl也变化了,所以无论如何pro都是0,我该如何确保flsum不变而只是fl变化,这样进度条就能变化了。或者有什么别的方法?求高手帮忙解答。谢谢!

    努力~



    • 已编辑 zjyh16 2012年3月15日 8:05
    2012年3月15日 8:04

答案

  • dear

    form load仅会触发一次,所有的变数初始或变化应该是由filesystemwatcher决定

    在每次filesystemwatcher侦测到一个事件后,process bar处理那个事完毕后,你必须要在把所有相关把数量旗标归0,以便下次的filesystemwatcher触发;假设你在砍挡时,有新的挡案加进来了,势必会影响你的旗标,这时你用int变数已经不符合你的需求,你要把挡案名称加到集合里,用集合处理。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年3月18日 10:13
  • 您好,原本想說只要在Changed事件中處理即可!

    如果不行的話,那就依您上次所說的,在Delete & Create事件中處理!

    感覺上只是要Check目前最大的檔案數,及目前的檔案數。

    您想一下看看是否能動態改變Maximum及Value的值!

    希望對您有所幫助!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年3月21日 1:31

全部回复

  • 您好,
    int flsum = Directory.GetFiles(path.ToString()).Length;
    这里取到的数量已是被删除后的档案数量哦!所以您每次算出来都是0的原因!
     
    您可在一开始时,就先把该目录的档案数量先记录下来,然后在Deleted事件中再取得已被删除後的数量!

    不过,您这个处理逻辑不需要考虑该目录如果新增档案时,要如何处理吗?

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月15日 10:07
  • 您好,
    int flsum = Directory.GetFiles(path.ToString()).Length;
    这里取到的数量已是被删除后的档案数量哦!所以您每次算出来都是0的原因!
     
    您可在一开始时,就先把该目录的档案数量先记录下来,然后在Deleted事件中再取得已被删除後的数量!

    不过,您这个处理逻辑不需要考虑该目录如果新增档案时,要如何处理吗?

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    谢谢您的回答!我该如何按照您说的“您可在一开始时,就先把该目录的档案数量先记录下来”这样做呢?我不可能在form_load之时或更前记录下来,因为途中可能文件的数量会变化。至于您说的“您这个处理逻辑不需要考虑该目录如果新增档案时”,我想在我这个程序中不需要考虑档案新增的情况,因为档案数量不为0时不会新增档案。所以我只需要做到每次有档案开始减少的时候,在减少前记录档案数量就行了,可是我该怎么做呢?

    努力~

    2012年3月15日 11:35
  • 您好,您說「我不可能在form_load之时或更前记录下来,因为途中可能文件的数量会变化。」,您一启动FileWatch时,就应先记录下来!

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月16日 5:54
  • 您好,您說「我不可能在form_load之时或更前记录下来,因为途中可能文件的数量会变化。」,您一启动FileWatch时,就应先记录下来!

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    您一启动FileWatch时,就应先记录下来! 事实上,FileWatch在程序开启后就一直启动着。

    努力~

    2012年3月16日 12:24
  • 您好,
    不知我的理解有没有错,如果有错误的话,请您指正一下哦!
    form_load时,先取得目录A的档案数,放到init_file_count变数之中,假设目前里面有10个档案,
    设定progressBar最大值为10,之后fileWatch也启动!
    再来如果目录A删除档案的话,在fsw_Delete Method中取得到数量就是9个,放到fls变数之中,再设定progressBar的值为9,之后如果又有删除档案的话,progressBar就会变成8,一直到数量为0。

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月17日 16:49
  • 您好,
    不知我的理解有没有错,如果有错误的话,请您指正一下哦!
    form_load时,先取得目录A的档案数,放到init_file_count变数之中,假设目前里面有10个档案,
    设定progressBar最大值为10,之后fileWatch也启动!
    再来如果目录A删除档案的话,在fsw_Delete Method中取得到数量就是9个,放到fls变数之中,再设定progressBar的值为9,之后如果又有删除档案的话,progressBar就会变成8,一直到数量为0。

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    以上说的没错,您说的form_load只能执行一次这样的事情,可是form_load之后就不再有form_load事件了。执行完第一次后然后又有档案进入目录,这时怎么取得这个档案数init_file_count和变数fls呢?或者是不是可以在fsw_Create事件把第一个init_file_count档案数传递给fsw_Delete事件,然后再Delete事件中获得变数fls,从而设定进度条呢?

    努力~

    2012年3月18日 6:49
  • 您好,
    小弟有个想法,请您参考是否符合您的需求!
    form_load时,记录目录A的档案数progressBar.Maximum
    再來在FileSystemWatcher的Changed事件取得档案数,如果档案数比progressBar.Maximum大的话,就将该值设定给progressBar.Maximum,比progressBar.Maximum小,就设定progressBar.Value。

    一切都在Changed事件處理。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月18日 9:59
  • dear

    form load仅会触发一次,所有的变数初始或变化应该是由filesystemwatcher决定

    在每次filesystemwatcher侦测到一个事件后,process bar处理那个事完毕后,你必须要在把所有相关把数量旗标归0,以便下次的filesystemwatcher触发;假设你在砍挡时,有新的挡案加进来了,势必会影响你的旗标,这时你用int变数已经不符合你的需求,你要把挡案名称加到集合里,用集合处理。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年3月18日 10:13
  • 您好,
    小弟有个想法,请您参考是否符合您的需求!
    form_load时,记录目录A的档案数progressBar.Maximum
    再來在FileSystemWatcher的Changed事件取得档案数,如果档案数比progressBar.Maximum大的话,就将该值设定给progressBar.Maximum,比progressBar.Maximum小,就设定progressBar.Value。

    一切都在Changed事件處理。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    Changed事件是“当对所监视的目录中的文件或目录的大小、系统属性、上次写入时间、上次访问时间或安全权限进行更改时,将引发 Changed 事件。”而我这个程序不会触发Changed事件,只有Delete事件,所以您说的“在FileSystemWatcher的Changed事件取得档案数”这不会触发,所以就实现不了。

    努力~

    2012年3月21日 1:20
  • dear

    form load仅会触发一次,所有的变数初始或变化应该是由filesystemwatcher决定

    在每次filesystemwatcher侦测到一个事件后,process bar处理那个事完毕后,你必须要在把所有相关把数量旗标归0,以便下次的filesystemwatcher触发;假设你在砍挡时,有新的挡案加进来了,势必会影响你的旗标,这时你用int变数已经不符合你的需求,你要把挡案名称加到集合里,用集合处理。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    您好,谢谢您的回答。我的程序是这样的,在监视目录不为空的时候,不会有新的档案进入目录,所以不会存在您说的“有新的挡案加进来了,势必会影响你的旗标”这种情况,这个在回答2楼亂馬客的时以做说明。然后呢,我只想在Delete事件中实现进度条。

    努力~

    2012年3月21日 1:24
  • 您好,原本想說只要在Changed事件中處理即可!

    如果不行的話,那就依您上次所說的,在Delete & Create事件中處理!

    感覺上只是要Check目前最大的檔案數,及目前的檔案數。

    您想一下看看是否能動態改變Maximum及Value的值!

    希望對您有所幫助!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年3月21日 1:31