C#遍历文件夹后上传文件夹中所有文件错误案例分析

所属分类: 软件编程 / C#教程 阅读数: 34
收藏 0 赞 0 分享

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#学习笔记之状态模式详解

这篇文章主要为大家详细介绍了C#学习笔记之状态模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C# 字符串、数组和List的截取和转换实例

下面小编就为大家分享一篇C# 字符串、数组和List的截取和转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

c#打包文件解压缩的实例

下面小编就为大家分享一篇c#打包文件解压缩的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

下面小编就为大家分享一篇浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题,具有很好的参考价值,希望对大家有所帮助
收藏 0 赞 0 分享

判断一个整数是否是2的N次幂实现方法

下面小编就为大家分享一篇判断一个整数是否是2的N次幂实现方法,实例简洁,具有很好的参考价值。希望对大家有所帮助
收藏 0 赞 0 分享

浅谈c#中config.exe 引发的一些问题

下面小编就为大家分享一篇浅谈c#中config.exe 引发的一些问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

基于C#开发中的那些编码问题(详谈)

下面小编就为大家分享一篇基于C#开发中的那些编码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

C#实现WPS文件转PDF格式的方法示例

这篇文章主要介绍了C#实现WPS文件转PDF格式的方法,涉及C#针对office组件的相关引用与操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现的文件上传下载工具类完整实例【上传文件自动命名】

这篇文章主要介绍了C#实现的文件上传下载工具类,结合完整实例形式分析了C#操作文件上传与下载功能,并且还可针对上传文件自动命名以避免服务器中的文件名重复,需要的朋友可以参考下
收藏 0 赞 0 分享

C# Socket 发送&接收&返回 简单应用实例

下面小编就为大家分享一篇C# Socket 发送&接收&返回 简单应用实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多