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

作者:lijiao 时间:2022-11-03 09:28:27 

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#,遍历,文件夹,上传文件
0
投稿

猜你喜欢

  • c#操作xml帮助类分享(xml增删改查)

    2022-03-02 04:09:21
  • C#中面向对象编程机制之多态学习笔记

    2023-12-06 20:16:33
  • Audio Source组件及相关API

    2023-07-07 14:22:37
  • 带你了解Spring中bean的获取

    2021-10-10 09:53:10
  • Java生成动态版验证码的方法实例

    2023-08-26 03:53:08
  • java 如何实现正确的删除集合中的元素

    2022-08-03 17:44:31
  • Spring Security权限管理实现接口动态权限控制

    2022-07-03 12:25:53
  • Java中try、catch的使用方法

    2021-11-08 00:48:12
  • seata-1.4.0安装及在springcloud中使用详解

    2023-02-21 00:49:21
  • 教你使用java实现去除各种空格

    2022-09-21 21:27:07
  • Springboot如何操作redis数据

    2022-05-30 21:36:41
  • 详解使用Docker搭建Java Web运行环境

    2023-10-24 15:32:58
  • mybatis if传入字符串数字踩坑记录及解决

    2022-07-18 00:41:18
  • SpringBoot整合ElasticSearch实践

    2023-02-05 06:02:08
  • 图文详解Java中的字节输入与输出流

    2022-12-23 23:14:48
  • 在Spring Boot2中使用CompletableFuture的方法教程

    2022-09-27 14:18:51
  • SpringBoot结合Redis配置工具类实现动态切换库

    2022-04-15 14:14:13
  • C#实现xml文件反序列化读入数据到object的方法

    2023-08-20 00:43:08
  • Idea防沉迷插件StopCoding的安装使用教程

    2023-11-23 07:29:32
  • springboot+vue制作后台管理系统项目

    2022-02-26 06:08:37
  • asp之家 软件编程 m.aspxhome.com