C#遍历文件夹后上传文件夹中所有文件错误案例分析
asp.net是没有直接选取文件夹的控件的,我也不知道,如果大家有的话可以一起交流下。后来我想着应该有三种方法:
①先将文件夹压缩后上传服务器,然后再服务器上解压;
②获得文件夹名及目录,然后遍历文件夹下面的文件以及子文件夹,循环上传;
③是使用AcitiveX控件。
那我果断就先通过上传对话框获得文件夹名和文件夹所在的系统文件路径,可是接下来就错愕了,一开始是想使用javascript遍历文件夹的
1 var fso = new ActiveXObject("Scripting.FileSystemObject");
2 var f = fso.GetFolder(document.all.fixfolder.value);
3 var fc = new Enumerator(f.files);
但是发现遍历不了,才得知要想创建FSO对象,操作文件,必须对该文件要有足够的权限才行,这样太麻烦了,于是我采取用C#来遍历文件夹,通过写一个ashx文件,在html里通过action将浏览的数据传送过来
以下是C#遍历文件夹之后上传文件夹下的所有文件引用片段:
<%@ WebHandler Language="C#" Class="folder" %> using System; using System.Web; using System.IO; public class folder : IHttpHandler { //采用递归的方式遍历,文件夹和子文件中的所有文件。 public void ProcessRequest(HttpContext context) { HttpRequest Request = context.Request; HttpResponse Response = context.Response; HttpServerUtility Server = context.Server; //指定输出头和编码 Response.ContentType = "text/html"; Response.Charset = "utf-8"; HttpFileCollection fs = HttpContext.Current.Request.Files; string newFilePath = Request.Form["sPath"]; if(fs.Count>0) { //fs[0]对应FindFile的dirPath就是指定目录,newFilePath绝对赢svrPath就是目标目录,也就是服务器上的目录 FindFile(fs[0].ToString(), newFilePath); } Response.Write("<script>parent.FileUploadDeal()</script>"); } //采用递归的方式遍历,文件夹和子文件中的所有文件。 public void FindFile(string dirPath,string svrPath) //参数dirPath为指定的目录,svrPath是目标目录 { //目标目录,也就是服务器上的目录 string sFilePath = System.Web.HttpContext.Current.Server.MapPath(svrPath); //string sFilePath = System.Web.HttpContext.Current.Server.MapPath(Request.Form["svrPath"]); //创建文件夹 if (!Directory.Exists(sFilePath)) Directory.CreateDirectory(sFilePath); //在指定目录及子目录下查找文件 DirectoryInfo Dir=new DirectoryInfo(dirPath); try { foreach(DirectoryInfo d in Dir.GetDirectories())//查找子目录 { FindFile(Dir+d.ToString()+"\\",svrPath+d.ToString()+"\\"); //FindFile(Dir+d.ToString()+"\",svrPath+d.ToString()+"\"); } foreach(FileInfo f in Dir.GetFiles()) //查找文件 { //f.SaveAs(Server.MapPath(svrPath + f.ToString()));//如果要保存到其他地方,注意修改这里 f.CopyTo(System.Web.HttpContext.Current.Server.MapPath(svrPath + f.ToString()), true); HttpContext.Current.Response.Write("4554132"); } } catch(Exception e) { ; } } public bool IsReusable { get { return false; } } }
原本以为这样就可以达到效果,但是却发现了一个致命的问题!因为Fileupload控件本身是不支持文件夹的上传,即使通过ashx也无法赋值给它。通过了解更多资料,得知,由于安全性原因,不可能直接在浏览器上通过代码直接上传本地文件夹,必须通过ActiveX控件才能实现。
从安全权限来分析,确实也是不允许的,否则我写一个网页,里面嵌入这段js代码,你一打开这个网页,js就可以开始慢慢的去遍历你的硬盘,把你的文件都上传到服务器。只有用户通过input控件自己选择的文件,才允许上传。
本文只是小编进行解决问题的一个思路并不是一个正确的方法,目的在于和大家进行学习交流,获得更好的解决办法。
栏 目:C#教程
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/6915.html
您可能感兴趣的文章
- 01-10Extjs4如何处理后台json数据中日期和时间
- 01-10C#实现主窗体最小化后出现悬浮框及双击悬浮框恢复原窗体的方
- 01-10C#删除只读文件或文件夹(解决File.Delete无法删除文件)
- 01-10C#语句先后顺序对程序的结果有影响吗
- 01-10C#编程实现获取文件夹中所有文件的文件名
- 01-10C#中用foreach语句遍历数组及将数组作为参数的用法
- 01-10C#程序中创建、复制、移动、删除文件或文件夹的示例
- 01-10简单实现C#异步操作
- 01-10当用户退出点击浏览器后退仍可回到原来页面的解决方案
- 01-10Windows中使用C#为文件夹和文件编写密码锁的示例分享
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11ajax实现页面的局部加载
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 04-02jquery与jsp,用jquery
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10C#中split用法实例总结
- 01-10delphi制作wav文件的方法