一切福田,不離方寸,從心而覓,感無不通。

文件管理系统

一、准备知识点:

1.对文件操作,先引用两个命名空间:using System.IO;(操作文件)、using Sysetem.Text;(操作文本)

2.创建文本文件:(1)创建文件名和文件内容(相当于新建文本文档)(2)创建StreamWriter对象,创建一个某某格式的文件(3)将内容写入数据流WriteLine (4)关闭StreamWrite对象.Close()

方法一:直接创建一个StreamWriter对象

string filename = TextBox1.Text

string filecontent= TextBox2.Text

StreamWriter sw =File.CreatText(Server.MapPath("~/txt/"+ filename +".txt"));

sw.WriteLine(filecontent);

sw.Close();

Response.Write("<script>alert('已经成功新建了一个’+ filename +'.txt,并添加了数据')</script>")

方法二:在创建StreamWriter对象之前先创建一个FileStream(文件流)对象,并在最后关闭它。

string filename = TextBox1.Text

string filecontent= TextBox2.Text

FileStream fs = new FileStream(Server.MapPath("~/txt/"+ filename + ".txt")),FileMode.Create,FileAccess.Write);  //文件流fs的路径、文件打开方式:创建和写操作

StreamWriter sw = new StreamWriter(fs,Encoding.Default);   //文件流fs和浏览器默认编码类型

sw.WriteLine(filecontent);

sw.Close();

fs.Close();

Response.Write("<script>alert('成功新建了一个’+ filename +'.txt,并添加了数据')</script>")

 

3.读取文本文本:

方法一:直接使用File.ReadAllText(文件路径,编码方式)

TextBox1.Text=File.ReadAllText(Server.MapPath("~/txt/**.txt"),Encoding.Default);

方法二:使用StreamReader对象以File.OpenText(文件路径)读取文件数据以及使用StreamBuilder对象的Append属性来添加读取文件的数据(UTF-8规范读取的数据)

StreamReader sr = File.OpenText(Server.MapPath("~/txt/**.txt"));

StreamBuilder sb = new StreamBuilder();

while(!sr.EndOfStream)               //如果数据不到最后一行,继续添加(循环语句)

{ sb.Append(sr.ReadLine() +"<br>");}

sr.Close();

方法三:使用StreamBuilder对象的Append属性添加从StreamReader对象那里读取的数据流,与前一种方法不同的是,这次用到了FileStream的File.Open方法取代了File.OpenText(文件路径)的方法(GB2312规范读取数据)

StreamBuilder sb = new StreamBuilder();

FileStream fs = File.Open(Server.MapPath("~/txt/**.txt"),FileMode.Open,FileAccess.Read);

StreamReader sr = new StreamReader(fs,Encoding.Default);

while(!sr.EndOfStream)

{ sb.Append(sr.ReadLine() +"<br>");}

sr.Close();

fs.Close();

 

4.文件管理系统编程步骤:

(1)引入命名空间:using System.IO; using System.Text;

(2)申明变量:string F_path;

(3)Default.aspx页面中的代码页Page_Load代码:

    if (!IsPostBack)
        {
            if (Request.QueryString["F_path"] == null)
            {
                F_path = Server.MapPath(".");  //指定首次加载的路径为我们的根目录
                ct_path.Text = F_path;    //指定当前路径为根目录
                tg_path.Text = F_path;    //指定目标路径为根目录
                fill(F_path);            //填充路径
            }
            else
            {
                F_path = Server.UrlDecode(Request.QueryString["F_path"]); //URL解码路径
                ct_path.Text = F_path;
                tg_path.Text = F_path;
                fill(F_path);
            }
        }

 (4)添加fill方法,用于根据参数带来的路径列出目录中的文件和文件夹:

     protected void fill(string path)
    {
        TableCell td;
        TableRow tr;
        Button btn;

        //创建一个表格某一行的某个单元格
        tr = new TableRow();

        td = new TableCell();

       //创建一个名为“名称”的按钮,按钮宽度:150
        btn = new Button();
        btn.Text = "名称";
        btn.Width = 150;

        //单元格中加入这个“名称”按钮控件,并将该单元格加入表格行的单元格集合中

        td.Controls.Add(btn);  
        tr.Cells.Add(td);

        //同理,再新建四个表格单元格,添加四个按钮

        td = new TableCell();
        btn = new Button();   //继续创建一个名为“类型”的按钮,宽度:60
        btn.Text = "类型";
        btn.Width = 60;
        td.Controls.Add(btn);
        tr.Cells.Add(td);

        td = new TableCell();
        btn = new Button();  //继续创建一个名为“大小”的按钮,宽度:80
        btn.Text = "大小";
        btn.Width = 80;
        td.Controls.Add(btn);
        tr.Cells.Add(td);

        td = new TableCell(); 
        btn = new Button();   //继续创建一个名为“修改日期”的按钮,宽度:80
        btn.Text = "修改日期";
        btn.Width = 80;
        td.Controls.Add(btn);
        tr.Cells.Add(td);

        td = new TableCell();
        btn = new Button();  //继续创建一个名为“操作”的按钮,宽度:200

        btn.Text = "操作";
        btn.Width = 200;
        td.Controls.Add(btn);
        tr.Cells.Add(td);

        tb_dir.Rows.Add(tr); //tb_dir 为页面中整个填充的表格ID名,将表格行tr添加到该表格的行中
        //接下来我们填充实际的内容了,也就是文件列表

        //首先申明几个下面常用的文件字符串变量
        string F_name;  //文件名
        string F_exp;   //扩展名
        string F_size;  //大小
        string F_time;  //修改时间
        HyperLink href;  //用于对文件或者文件夹进行操作的链接(如打开、重命名、移动、复制等)
        string url;

        DirectoryInfo di = new DirectoryInfo(path); //新建一个带路径参数的文件夹

        foreach (FileSystemInfo fsi in di.GetFileSystemInfos())
        { //GetFileSystemInfos是一个文件夹中所有文件个子目录的强类型FileSystemInfo项数组
            //我们这里就来迭代数组中的每一个项
            if (fsi is FileInfo   //如果是文件
            {//如果该项是文件,首先得出他的相关属性
                FileInfo fi = (FileInfo)fsi;  //数组型转换为FileInfo类型
                F_name = fi.Name      //获取文件的名字
                if (fi.Extension.Length < 1)    //如果文件没有扩展名
                    F_exp = "";
                else
                    F_exp = fi.Extension.Remove(0, 1);  // 文件扩展名留下不带“.”的扩展名
                F_size = fi.Length.ToString();   //获取文件的大小
             F_time = fi.LastWriteTime.ToShortDateString(); //获取上次写入当前文件或目录的时间
            }
            else
             //否则是文件夹
                di = (DirectoryInfo)fsi; //同样先转换
                F_name = di.Name;
                F_exp = "文件夹";
                F_size = ""; //这里如果想要判断文件夹的大小的话就做个迭代,将里面全部的文件大小相加即可,反正我是这样想的,不知道有没更好的办法
                F_time = di.LastWriteTime.ToShortDateString();

            }
            //以上每个项的相关属性都有了,下面该给页面附上列表了

            tr = new TableRow();

           //创建了表的某行,然后开始创建单元格加入Literal容器控件将数据一个个装入

            td = new TableCell();

            td.Controls.Add(new LiteralControl(F_name));
            tr.Cells.Add(td);

            td = new TableCell();
            td.Controls.Add(new LiteralControl(F_exp));
            tr.Cells.Add(td);

            td = new TableCell();
            td.Controls.Add(new LiteralControl(F_size));
            tr.Cells.Add(td);

            td = new TableCell();
            td.Controls.Add(new LiteralControl(F_time));
            tr.Cells.Add(td);

            //接下来我们做几个对文件进行操作的按纽

            if (fsi is DirectoryInfo

         //如果是文件夹则执行“打开”“重命名”“删除”“移动”“复制”操作
            {
                href = new HyperLink();
                href.Text = "打开";
                url = Server.UrlEncode(F_path); //将物理路径编码为服务器能识别的Url
                href.NavigateUrl = "~/Default.aspx?F_path=" + url + "\\" + F_name;
                td = new TableCell();
                td.Controls.Add(href);
                tr.Cells.Add(td);
            }
            else
            {
                td = new TableCell();
            }

            if (fsi is FileInfo

       //如果是文件,则执行“编辑”“删除”“移动”“复制”操作
            {
                href = new HyperLink();
                href.Text = "编辑";
                url = Server.UrlEncode(F_path);
                href.NavigateUrl = "~/edit.aspx?ax=editfile&path=" + url + "&fname=" + F_name;
                td.Controls.Add(href);
                tr.Cells.Add(td);
            }
            else
            {
                href = new HyperLink();
                href.Text ="重命名";
                url = Server.UrlEncode(F_path);
                href.NavigateUrl = "~/edit.aspx?ax=editdir&path=" + url + "&fname=" + F_name;
                td.Controls.Add(href);
                tr.Cells.Add(td);
            }

            if (fsi is FileInfo)
            {
                href = new HyperLink();
                href.Text = "删除";
                href.Attributes.Add("onClick", "return confirm('一旦删除,将无法恢复!')");
                url = Server.UrlEncode(F_path);
                href.NavigateUrl = "~/edit.aspx?ax=deletefile&path=" + url + "&fname=" + F_name;
                td.Controls.Add(href);
            }
            else
            {
                href = new HyperLink();
                href.Text = "删除";
                href.Attributes.Add("onClick", "return confirm('一旦删除,将无法恢复!')");
                url = Server.UrlEncode(F_path);
                href.NavigateUrl = "~/edit.aspx?ax=deletedir&path=" + url + "&fname=" + F_name;
                td.Controls.Add(href);
            }

            if (fsi is FileInfo)
            {
                href = new HyperLink();
                href.Text = "移动";
                url = Server.UrlEncode(F_path);
                href.NavigateUrl = "~/edit.aspx?ax=movefile&path=" + url + "&fname=" + F_name;
                td.Controls.Add(href);
            }
            else
            {
                href = new HyperLink();
                href.Text = "移动";
                url = Server.UrlEncode(F_path);
                href.NavigateUrl = "~/edit.aspx?ax=movedir&path=" + url + "&fname=" + F_name;
                td.Controls.Add(href);
            }

            if (fsi is FileInfo)
            {
                href = new HyperLink();
                href.Text = "复制";
                url = Server.UrlEncode(F_path);
                href.NavigateUrl = "~/edit.aspx?ax=copyfile&path=" + url + "&fname=" + F_name;
                td.Controls.Add(href);
            }
            else
            {
                href = new HyperLink();
                href.Text = "复制";
                url = Server.UrlEncode(F_path);
                href.NavigateUrl = "~/edit.aspx?ax=copydir&path=" + url + "&fname=" + F_name;
                td.Controls.Add(href);
            }

            tr.Cells.Add(td);   //把所有的单元格填充到该行的单元格集合中

            tb_dir.Rows.Add(tr); //将该行添加到整个列表中
        }

        //==============下面的代码是通过下拉列表框选择路径跳转目录===========================
        DropDownList1.Items.Clear(); //先清除里面的全部项
        DropDownList1.Items.Add("请选择目标目录");
        if (F_path.Length > 4)  //超过了路径长度比如:C:\\**
        {
            DropDownList1.Items.Add("返回上级目录");
            DropDownList1.DataSource = Directory.GetDirectories(F_path); //文件夹目录数据绑定
            DropDownList1.DataBind();

        }
        else  //没有超过路径长度(正好是根目录比如C:\\)
        {
            string[] item = Directory.GetLogicalDrives();  //得到磁盘驱动列表
            for (int i = 0; i < item.Length; i++)  //遍历该根目录下的列表(以项目个数)
            {
                DropDownList1.Items.Add(item[i]);
            }

           DropDownList1.DataSource = Directory.GetDirectories(F_path);//下拉列表绑定路径     

           DropDownList1.DataBind();
        }

        if(chk_tv.Checked)   //一个复选框,要求是否改变根目录树TreeView1的列表?
            directorytoxml.BindTree(TreeView1, F_path);    //以目录xml文档填充目录树
        else
            directorytoxml.BindTree(TreeView1, "e:\\\\net");

    }

(5)创建文件和文件夹:

 protected void btn_create_Click(object sender, EventArgs e)
      //创建文件
        file f = new file();
        string tagFile = tg_path.Text + "\\" + new_file.Text; //目标路径=路径+新建文件名
        f.Create(tagFile);
        F_path = tg_path.Text;
        fill(F_path);
    }

 protected void btn_dir_Click(object sender, EventArgs e)
      //创建文件夹
        FileDirectory fd = new FileDirectory();
        string tagDir = tg_path.Text + "\\" + new_dir.Text //目标路径=路径+新建文件夹名
        fd.CreatedDir(tagDir);
        F_path = tg_path.Text;
        fill(F_path);
    }

(6)自己创建两个新类: FileDirectory 对文件夹提供删除移动创建拷贝等操作方法、file 对文件提供删除移动创建拷贝等操作方法

a.在App_Code中建立一个FileDirectory.cs:

引入命名空间:using System.IO;

public class FileDirectory
{
    private DirectoryInfo di;   //对文件夹的访问和操作(DirectoryInfo是基类

    public FileDirectory() 
    {
    }

 /// <summary>
    /// 创建新的文件夹
    /// </summary>
    /// <param name="TagDir">新文件夹的路径 + 名称</param>

  public bool CreatedDir(string TagDir)
    {
        bool c;
        di=new DirectoryInfo(TagDir);
        try
        {
            if(!di.Exists  //必须是文件夹不存在
            {
                di.Create();
                c=true;
            }
            else
                c=false;
        }
        catch(Exception e)
        {
            c=false;
        }
        return c;
    }

 

转自:http://blog.sina.com.cn/s/blog_4a93ccea0100cu49.html