如果利用 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