我写了一个简单的windows service 主要代码如下:        protected override void OnStart(string[] args)
        {
           WriteLog("ScheculerServer Start at " + DateTime.Now.ToString());
             aTimer.Elapsed += new ElapsedEventHandler(OnTimer);
           aTimer.Interval = 1000 * 3600; //每1小时
             aTimer.Enabled = true;
           aTimer.Start();
        }
        public static void FindAllFileAndDel(string path)//统计(删除)过期文件
        {
            DirectoryInfo[] ChildDirectory;//子目录集
            FileInfo[] NewFileInfo;//当前所有文件
            DirectoryInfo FatherDirectory = new DirectoryInfo(path); //当前目录
            ChildDirectory = FatherDirectory.GetDirectories("*.*"); //得到子目录集
            NewFileInfo = FatherDirectory.GetFiles();//得到文件集,可以进行操作
            foreach (FileInfo fileinfo in FatherDirectory.GetFiles("*.*"))
            {
                DateTime dt = DateTime.Now.Date;
                if (fileinfo.LastWriteTime.AddDays(90) < dt)//假如最后修改时间是90天之前时
                {
                    //fileinfo.Delete();
                    delcount = delcount + 1;
                }
            }
            foreach (DirectoryInfo dirInfo in ChildDirectory)
            {
                FindAllFileAndDel(dirInfo.FullName);
            }
        }
        public static void OnTimer(object state, ElapsedEventArgs e)
        {
            System.Timers.Timer aTimer = (System.Timers.Timer)state;
            DateTime dtNow = DateTime.Now;
            DateTime dtRun = Convert.ToDateTime(RunTime) ;
            aTimer.Stop();
            WriteLog("start to count the file's number");
            FindAllFileAndDel("z:\\个人目录");
            WriteLog("need to delete file's number:" + delcount.ToString()); 
            aTimer.Start();
        }现在的情况是,如果被统计的目录里的文件数不多的话,在日志里可以得到文件数量,但如果文件比较多的话,日志里就没有相应的记录。请问这到底是怎么回事呢,应该如何解决好?

解决方案 »

  1.   

    补充一点,文件多时,日志里只有如下信息:
    ScheculerServer Start at 14:46:31
    start to count the file's number 
      

  2.   

    把            FindAllFileAndDel("z:\\个人目录");放到try中,顺便将异常信息也写到日志中看看
      

  3.   

    问题没看出来但是 DateTime dt = DateTime.Now.Date;在FindAllFileAndDel函数里面我想可能不合适,效率低了不少这句话拿到ontimer里面去应该会好点吧
      

  4.   

    DateTime   dt   =   DateTime.Now.Date 是用来比较所获取的文件修改日期是不是在90天前的,所以应该不能放在ontimer吧
      

  5.   

    对阿,这个dt不是当时的日期么? 逻辑上只需要在ontimer里面获取一次就可以了吧? 如果放在目前的位置就是说检查每个文件都要看一遍目前的日期,是不是有点浪费? 当然如果这个FindAllFileAndDel函数执行时间跨天的话,会少删除一些文件,我想这个可能性不大吧?
      

  6.   

    哦,service访问映射盘是有可能出错的,因为开机时service的启动次序在映射之前,如果要用映射盘最好自己在程序里实现映射。登录后exe执行程序访问就没有这个问题了
      

  7.   

    很感谢您一直以来的帮忙。"登录后exe执行程序访问就没有这个问题了"是啥意思呢? 由于我把访问路径设置到xml文件里,所以每次测试时我只是把服务stop后再开启,并没有重新启动电脑。所以在启动服务前,映射盘一直都是存在的。到事实上的确是访问映射盘的问题,我照5楼的修改了一下,得到“未能找到路径“Z:\个人目录”的一部分”的日志信息。
      

  8.   

    "登录后exe执行程序访问就没有这个问题了" 我是想说用C#做一个console或者winform来访问映射盘就应该没有问题我想可能Service在登录后重新start也还是不能访问映射盘的,有权限的问题,一般service服务默认的启动身份是local SYSTEM.我想你可以试试看把自定义服务的属性修改一下,把log on改成用管理员帐户登入,同时允许服务访问desktop。(在windows服务列表中点该服务的属性)我没试验过,仅供参考
      

  9.   

    的确,我在winform里测试就正常
      

  10.   

    再请教一下alanfoxye,ontimer()里的 atimer.stop()和 atimer.start()有什么特别的意义吗,我去掉这两句后执行的结果没有差别啊
      

  11.   

    ontimer()里的   atimer.stop()和   atimer.start()是防止ontimer的重入如果FindAllFileAndDel函数耗时很长,还没有结束的时候timer时间到,就会再次进入ontimer,可能会导致逻辑错误。如果时间间隔很大,而FindAllFileAndDel并不耗时,可以不必加这两句话,不加这两句话可以基本保证每次触发timer的时间间隔完全一致