当前位置:编程学习 > C#/ASP.NET >>

如果利用 Application_Start 里面开一个 Timer 来执行删除某个文件夹中的文件

如果利用 Application_Start 里面开一个 Timer 来执行删除某个文件夹中的文件 
问题:以下代码在本地一切正常 上传到服务器就无效 也不会报错误 
======================================================================================================
问题详细分析:Application_Start 里面开一个 Timer 来执行任何任务都无问题 只有当遇到要删除某个文件时无效
但是同样的删除代码 手工在 System.Web.UI.Page 页面代码里确能执行删除
======================================================================================================
以下是代码片段:
public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            // 在HttpApplication 类的第一个实例被创建时,该事件被触发。它允许你创建可以由所有HttpApplication 实例访问的对象。
                //定义定时器 1
                System.Timers.Timer Timer = new System.Timers.Timer(20000);//20秒
                Timer.Elapsed += new ElapsedEventHandler(Task);
                Timer.Enabled = true;
                Timer.AutoReset = true;
                Timer.Start();
        }
        void Task(object source, ElapsedEventArgs e)
        {
            /////////以下是系统任务/////////
                WebHotelData.HotelTableAdapters.HotelTableAdapter HotelTableAdapter = new WebHotelData.HotelTableAdapters.HotelTableAdapter();
                DataView DataView = new DataView(HotelTableAdapter.GetData());
                DataView.RowFilter = "identifier = '1'";
                foreach (DataRow DataRow in DataView.ToTable().Rows)
                {
                    Public.Computing_Time(DataRow["oid"].ToString().Trim());//。。。
                    Public.ar_(DataRow["oid"].ToString().Trim());//。。。
                    Public.ar(DataRow["oid"].ToString().Trim());//。。。
                    Public.Weathe(DataRow["oid"].ToString().Trim());//获取天气预报
                }

                if (System.DateTime.Now.CompareTo(System.DateTime.Now.Date.AddHours(23).AddMinutes(59)) == 1 || System.DateTime.Now.CompareTo(System.DateTime.Now.Date.AddHours(23).AddMinutes(59)) == 0)//如果大于23:59或 等于23:59 并且小于 23:59:59
                {// && System.DateTime.Now.CompareTo(System.DateTime.Now.Date.AddHours(23).AddMinutes(59).AddSeconds(59)) == -1
                    if (Public.Email())//发送邮件
                    {

                    }
                }

                Public.DeleteFile(HttpRuntime.AppDomainAppPath + "ViewState", 10);//删除缓存文件//此任务上传服务器后无法实现 手工在System.Web.UI.Page 页面可以实现 不会报错 =====本地2者都可以实现 
                Public.DeleteFile(HttpRuntime.AppDomainAppPath + "Log", 10);//删除日志文件//此任务上传服务器后无法实现 手工在System.Web.UI.Page 页面可以实现 不会报错 =====本地2者都可以实现 
       
         }
         
         /// <summary>
        /// 删除服务器文件 如果 M != -1 并且总大小大于M 删除所有文件;否则 删除所有文件
        /// </summary>
        /// <param name="path"></param>
        /// <param name="M"></param>
        public static bool DeleteFile(string path, int M)
        {
            if (path.Trim() != "")
            {
                System.IO.DirectoryInfo DirectoryInfo = new System.IO.DirectoryInfo(path);
                if (!DirectoryInfo.Exists)
                {
                    DirectoryInfo.Create();
                }
                else
                {
                    System.IO.FileInfo[] FileInfo_ = DirectoryInfo.GetFiles();

                    if (M > -1)//是否要删除所有文件 -1 = 删除所有
                    {
                        long a = 0;

                        foreach (System.IO.FileInfo FileInfo in FileInfo_)
                        {
                            a = a + FileInfo.Length;
                        }

                        if (Math.Truncate(Convert.ToDouble(a / 1000)) > Convert.ToInt32(M * 1000))//如果所有文件大于1M 删除所有文件
                        {
                            foreach (System.IO.FileInfo FileInfo in FileInfo_)
                            {
                                FileInfo.Delete();
                            }
                        }
                    }
                    else
                    {
                        foreach (System.IO.FileInfo FileInfo in FileInfo_)
                        {
                            FileInfo.Delete();
                        }
                    }

                    return true;
                }
            }

            return false;
        }
     } --------------------编程问答-------------------- 添加try catch
是否有操作权限 --------------------编程问答-------------------- 服务器权限不够 --------------------编程问答-------------------- 添加try catch 也写不到日志 凡是涉及文件操作都无效!

服务器权限不够。。。。。。这个可能性  更大 


那为什么页面却有文件操作权限?Global里却没有?

=============================================================================== --------------------编程问答-------------------- 顶上去 这个问题!希望懂的进来发表下意见及建议!谢谢了 --------------------编程问答-------------------- 感觉是服务器的操作权限问题 --------------------编程问答-------------------- 页面访问时,用户是在IIS的安全选项中设置的用户;
而application start时,执行者不知道是谁,可能是aspnet_user 还是network service用户,估计和服务器的操作系统版本有关。

只是猜测,Mark一下, 看是否有高手回答 --------------------编程问答-------------------- 6楼答案感觉很接近于最终答案!

那如果是这样 不知道有没有好的解决方案来实现。。。

把删除文件的操作 放到页面去执行? --------------------编程问答-------------------- 如果你有操作服务器的权限, 可以试下把网站的文件夹, 赋操作权限给我说的那两个用户 看行不行 --------------------编程问答-------------------- 关键是没有服务器的操作权限 --------------------编程问答-------------------- 1,首先判断你的Timer代码是否执行了。另外,建议使用
System.Threading.Timer
2,文件路径是否正确

--------------------编程问答-------------------- --------------------编程问答-------------------- 如果楼主的问题还不能解决, 可以用下面的方法:

1, 在你的Page里做这件事
2, 在另一台有权限的主机上, 用定时器定时执行这个Page. 

缺点就是你要有一台一直不断线的主机. --------------------编程问答-------------------- 谢谢 (【孟子E章】)  


Timer代码是执行了 其他任务都可完成

文件路径绝对正确


谢谢 sunhahaha2

按照你的说法 是最不愿意看到的结果
与其这样还不如放在会话结束里面来解决这个删除文件问题

protected void Session_End(object sender, EventArgs e)
{
    其实我要删除的是大量的 页面视图文件 我把页面的视图存放在了服务器上 免得占用传输带宽
     所以要定时删除这些文件 
}

希望更多的朋友来给出更加好的解决方案
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,