有个很老的代码,监控某个文件夹(filewatch),如果有后缀print文件,就去打印,打印完删除文件。
原本应该是vb生成文件,后来改成web,这个功能是一个小弟做的,整了几月都没搞定。
问题1,web会生成两个文件,一个是xml,一个是print,xml有的浏览器不会下载,而是直接在网页里打开。
其实直接在后台用stream输出就直接下载了,但是他是用js在前台下载的,prod环境就打开,dev就直接下载,看来是IIS配置问题,搜了搜,MIME Type,找到xml,原本是text,改成流就行,因为文本类型系统知道怎么打开,所以它会自作主张。
不过最好还是用C#代码来write流,这样不用改服务器。
问题2,edge没有反应
原本只监听文件的create事件,猜想有些浏览器触发的不是create事件,增加rename事件,解决。
问题3,firefox会报文件不存在,但是又能打印成功。
猜想事件触发了多次,增加一个字典,key是文件名,value是日期,重复的文件不处理,防止字典越来越大,需要删除过时数据。
lock (locker)
{
if (fileDictionary.ContainsKey(e.Name))
{
return;
}
//删除之前的key
var list = fileDictionary.Keys.ToList();
foreach (var key in list)
{
DateTime dateTime = fileDictionary[key];
if (dateTime < DateTime.Now.AddMinutes(-5))
{
fileDictionary.Remove(key);
}
}
fileDictionary.Add(e.Name, DateTime.Now);
}