璀璨星辰

 

2011年7月7日

c#文件操作 完美版 转载自:http://hi.baidu.com/k_boy/blog/item/906900b3bb9162a4d9335a94.html

在.NET Framework中进行的所有的输入和输出工作都要使用到流。流是串行化设备的抽象串行化设备可以以线性方式存储数据,并可以以同样的方式访问:一次访问—个字节。此设备可以是磁盘文件、打印机、内存位置和或任何其他支持以线性方式读写的对象。

当向某些外部目标写数据时,就要用到输出流,这可以是物理磁盘文件、网络位置、打印机或其他程序。

 

常用的类:

File------实用类,提供许多静态方法,用于移动、删除、和复制文件。

Directory------实用类,提供许多静态方法,用于移动、删除和复制目录。

Path------ 实用类,用于处理路径名称。

FileInfo------表示磁盘上的物理文件,具有可以处理此文件的方法,要完成对文件的读写工作,就必须创建Stream对像。

DirectoryInfo------表示磁盘上的物理目录,具有可以处理此目录的方法

FileStream-------表示可以被写或被读,或二者都可的文件,此文件可以同步或异步读和写

StreamReader------从流中读取字符数据,并可通过使用FileStream被创建为基类。

StreamWriter------向流写字符数据,可通过使用FileStream被创建为基类。

FileSystemWatcher---- FileSystemWatcher是用于监控文件和目录,并在这些位置发生变化时,给出应用程序可以捕获的事件。

 

 

◆File和Directory类

作为实用类,File和Directory类都提供了许多方法,用于处理文件系统以及其中的文件和目录。这些是静态方法,涉及移动文件、查询和更新属性并创建FileStream对象。

File类一些最常用的静态方法:

Copy()------将文件复制到规定的位置

Create()------在规定的恢蒙洗唇ㄎ募?/FONT>

Delete()------删除文件

Open()-------在规定的路径上返回FileStream对像

Move()------将规定的文件移动到新位置,可以在新位置给文件规定不同的名字

 

Directory类的一些常用的静态方法

CreateDirectory()------创建具有规定路径的目录

Delete()------删除规定的目录以及其中的所有文件

GetDirectories()------返回表示当前目录之下的目录的Directory对像的数组

GetFiles()-------返回在当前目录中的File对像的数组

Move()------将规定的目录移动到新位置。可以在新位置为文件夹规定一个新名称

 

FileInfo 类

FileInfo类不像File类,它没有静态方法,仅可用于实例化的对像。FileInfo对像表示在磁盘或网络位置的文件,注意它不是流,为了读写文件,必须创建Stream对像。

fileInfo类提供了下面的关于基础性的文件的属性,这些属性可能用来更新文件。

Attributes-----获取或设置当前文件的属性

CreationTime------获取当前文件的创建日期和时间

DirectoryName------获取文件目录的路径

Exists------判断是否存在文件

FullName------检索文件的完整路径

Length------获取文件的容量

Name------仅仅返回文件的名称,而不是完整的文件位置路径、

 

       当在.NET代码中规定路径名时,您可以使用绝对路径名,也可以使用相对路行名。绝对路径名显式地规定文件或目录来自于哪—个己知的位置——比如是c:驱动器。它的—个范例是C:\work\LogFile.txt。注意它淮确地定义了其位置。

  相对路径名相对于应用程序在文件系统上运行的位置。通过使用相对路径名称,无需规定已知的驱动器或位置;当前的目录就是起点。例如,如果应用程序运行在c:\DeVelopment\FileDemo目录上(这里的应用程序是指代码生成后的exe文件),并使用了相对路径“LogFile.txt,”,则该文件就位于C:\DeVelopment\FileDemo\LogFile.txt中。为了上移目录,则使用.. 字符。这样,在同一个应用程中路径“../test.txt”是指向应用程序所在的目录的上一级目录里的文件test.txt。

 

 

◆FileStream对象

FileStream对象表示在磁盘或网络路径上指向文件的流。当类提供向文件读写字节的方法时,经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作字节和字节数组,而Stream类操作字符数据。字符数据易于使用,但是有些操作比如随机文件访问,就必须由FileStream对象执行。

FileStream对象的构造函数:

FileStream aFile = new FileStream(“Log.txt”,FileMode.OpenOrCreate);

FileMode枚举具有几种成员:

Append------如果文件存在,就打开文件,将文件位置移动到文件的末尾,并创建一个新文件。FileMode.Append仅可以与枚举FileAccess.Write联合使用

Create------创建新文件;如果存在这样的文件,就破坏它。

CreateNew------创建新文件,但是如果已经存在此文件,则抛出异常

Open------打开现有的文件,但是不存在所指定的文件,则抛出异常

OpenOrCreate------如果文件存在,则规定打开文件,否则就创建新文件,如果文件已经存在,则保留在文件中的数据

Truncate------打开现有文件,清除其内容,然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期,必须存在有文件,否则就抛出异常

 

访问级别

 前面的构造函数默认以只读模式打开文件,需要一个附加参数规定不同的访问级别,此参数是FileAccess参数。

FileStream aFile=new FileStream(”Log.txt”,fileMode.OpenOrCreate,FileAccess.Write)

        FileAccess枚举有三种类型:Read、Write、ReadWrite.此属性的作用是:基于用户的身份验证级别改变用户对文件的访问

 

 读取文件的位置用seek:public long Seek(long offset,SeekOrigin origin)

Long offset是规定文件指针以字节为单位的移动距离;SeekOrigin origin是规定开始计算的起始位置,此枚举包含3个值:Begin,Current和End。

   例:aFile.Seek(8,SeekOrigin.Begin);// SeekOrigin.Begin指得是文件指针从文件的第一个字节起;而参数‘8‘指得是移动到文件的第8个字节

   例2:afile.Seek(2,SeekOrigin.Current)//在当前位置开始,再移动2个字节。

   例3:aFile.Seek(-5,SeekOrigin.End)//在文件末端位置开始,倒数5个字节。


     读取数据

使用FileStream类读取数据不像使用StreamReader和StreamWriter类读取数据那么容易,这是因为FileStream类只能处理原始字节(raw byey),这使得FileStream类可以用于任何数据文件,而不仅仅是文本文件,通过读取字节数据就可以读取类似图像和声音的文件。这种灵活性的代价是不能使用它直接读入字符串,而使用StreamWriter和StreaMeader类却可以这样处理,从是有几种转换类可以很容易地将字节数组转换为字符数组,或者进行相反的操作。

Read()方法是从FileStream对象所指向的文件访问数据的主要手段:

Public int Read(byte[] array,int offset, int count)//第一个参数是被传输进来的字节数组,用以接受FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置,它通常是0,表示从数组的开端的文件中向数组写数据,最后一个参数是规定从文件中读出多少字节。

写入数据

写入数据的流程是先获取字节数组,再把字节数据转换为字符数组,然后把这个字符数组用Write()方法写入到文件中,当然在写入的过程中,可以确定在文件的什么位置写入,写多少字符等等。

 

文件读写的范例:


读取文件
 using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace myFile
{
       class Program
       {
           static void Main(string[] args)
           {
               byte[] byData = new byte[100];//建立一个FileStream要用的字节组
               char[] charData = new char[100];//建立一个字符组

               try
               {
                   FileStream aFile = new FileStream("http://www.cnblogs.com/http://www.cnblogs.com/Data.txt", FileMode.Open);//实例化一个FileStream对象,用来操作data.txt文件,操作类型是
                
                   aFile.Seek(55, SeekOrigin.Begin);//把文件指针指向,从文件开始位置向前55位字节所指的字节
                   aFile.Read(byData, 0, 100);//读取FileStream对象所指的文件到字节数组里
               }
               catch (IOException e)
               {
                   Console.WriteLine("close");
                   return;
               }
               Decoder d = Encoding.UTF8.GetDecoder();//
               d.GetChars(byData, 0, byData.Length, charData, 0);//将编码字节数组转换为字符数组

               Console.WriteLine(charData);
               Console.ReadLine();
               return;
           }
       }
}

写入文件:


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace myFile
{
       class Program
       {
           static void Main(string[] args)
           {
               byte[] byData = new byte[100];//建立一个FileStream要用的字节组
               char[] charData = new char[100];//建立一个字符组

               try
               {
                   FileStream aFile = new FileStream("http://www.cnblogs.com/http://www.cnblogs.com/Data.txt", FileMode.Open);//实例化一个FileStream对象,用来操作data.txt文件,操作类型是
               
                   charData = "我是谁?111?".ToCharArray();//将字符串内的字符复制到字符组里
                   aFile.Seek(0, SeekOrigin.End);
                   Encoder el = Encoding.UTF8.GetEncoder();//编码器
                   el.GetBytes(charData, 0, charData.Length, byData, 0, true);

                   aFile.Write(byData, 0, byData.Length);
               }
               catch (IOException e)
               {
                   Console.WriteLine("close");
                   return;
               }
           
           }
       }
}

  
◆StreamWriter对像

 

用FileWriter来随机读取文件是个好主意,而用StreamWriter可以直接把字符串写入文件中,它处理重要的转换和向FileStream对像写入工作。创建StreamWriter有很多方法:

FileStream aFile = new FileStream(“Log.txt”,FileMode.CreatcNew);

StreamWriter sw = new StreamWriter(aFile);

也可直接从文件中创建StreamWriter对象:

  StreamWriter sw = new StreamWriter(“Log.txt”,true);

       后面这个Boolean值规定是附加文件还是创建新文件,如果此值为false,则就创建一个新文件,或者截取现有文件并打开它。如果此值设置为true,则打开文件,保留原来的数据,如果找不到文件,则创建一个新文件。注意:当创建FileStream对象时,您无法得到选项的范围。除了使用Boolean值附加或创建新文件外,我们根本就无法像使用FileStream类时那样规定FileMode属性;而且,您也无法设置FileAccess属性.因此您总是具有对文件的读写特权,为了使用任何高级参数,您必须在FileStream构造函数中规定这些参数,然后在FileStream对象中创建StreamWriter。


例:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace StreamWriterFile
{
       class Program
       {
           static void Main(string[] args)
           {
               try
               {
                   FileStream aFile = new FileStream("data1.txt", FileMode.OpenOrCreate);//建立一个fileStream对象
                   StreamWriter sw = new StreamWriter(aFile);//用FileStream对像实例一个StreamWriter对象
               
                   sw.Write("first.");
                   sw.WriteLine("hello world!!!");//写入字符串,方法WriteLine写入时后面跟一个换行符
                   sw.Write("This is a");//写入字符串,方法Write写入时没有换行符
                   sw.Write("string of characters.");
                   sw.Close();//用完后必须关闭对像
               }
               catch (IOException e)
               {
                   Console.WriteLine(e.ToString());
               }
           }
       }
}

  
◆StreamReader对象

 

1.读取文件

输入流用于从外部源读取数据,在很多情况下,数据源可以是磁盘上的文件或网络的某些位置,任何可能发送数据的位置都可以是数据源,比如网络应用程序,web服务,甚至是控制台。StreamReader是一个通用类,可以用于任何流;StreamReader对象的创建方式非常类似于StreamWriter对象的创建方式。

StreamWriter类有两个基本的方法read和readLine

Read()方法将流的下一个字符作为正整数值返回,如果到达了流的结尾处,则返回-1

ReadLing()方法是读取并返回一行字符,如果返回为空,那么就是到达了流的结尾。

ReadEnd()方法读小文件最好,它直接读取完整的文件并作为字符串返回。


例:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace StreamReaderTest
{
       class Program
       {
        
           static void Main(string[] args)
           {
               string strLine;
               try
               {
                   Console.Write("请输入文件路径及文件名:");
                   string mess = Console.ReadLine();
                   FileStream aFile = new FileStream(mess, FileMode.Open);
                   StreamReader sr = new StreamReader(aFile);//用FileStream对象实例化一个StreamReader对象
                   //strLine = sr.ReadToEnd();//读取完整的文件,如果用这个方法,就可以不用下面的while循环
                   strLine = sr.ReadLine();//     读取一行字符并返回
                   while (strLine != null)
                   {
                       Console.WriteLine(strLine);
                       strLine = sr.ReadLine();
                   }
                   sr.Close();
                   Console.ReadLine();
               }
               catch (IOException e)
               {
                   Console.WriteLine("an IOexception has been thrown!");
                   Console.WriteLine(e.ToString());
                   return;
               }
               return;
           }
       }
}

  
2.分隔文件

读取使用逗号分隔的文件,string类提供了一种称为Split()的方法,可以用于将字符串按照提供的分隔符分隔成字符组.


例:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace CommaValues
{
       class Program
       {
           static void Main(string[] args)
           {
               while (true)
               {
                   string strLine;
                   string[] strArray;
                   char[] charArray = new Char[] { ',' };
                   Console.Write("请输入文件内容以逗号分隔的文件路径及文件名:");
                   string name = Console.ReadLine();

                   try
                   {
                       FileStream aFile = new FileStream(name, FileMode.Open);
                       StreamReader sr = new StreamReader(aFile);

                       strLine = sr.ReadLine();
                       while (strLine != null)
                       {
                           strArray = strLine.Split(charArray);
                           for (int x = 0; x <= strArray.GetUpperBound(0); x++)
                           {
                               Console.WriteLine(strArray[x].Trim());
                           }
                           strLine = sr.ReadLine();
                       }
                       sr.Close();
                       //Console.ReadLine();
                   }
                   catch (IOException e)
                   {
                       Console.WriteLine(e.ToString());
                       return;
                   }
                   //return;
               }
           }
       }
}

posted @ 2011-07-07 11:08 璀璨星辰 阅读(156) 评论(0) 编辑

2011年6月28日

Asp.net动态添加附件上传转载

两种方式:
1、如果页面中form指定了enctype="multipart/form-data" 属性则可以无file服务器控件
2、如果页面上有初始的file服务器控件(必须有runat="server"标志)可以无enctype="multipart/form-data"属性,但是这个页面上必须至少有一个runat="server"的file控件,否则后台接收不到Request.Files。

<%@ Page language="c#" Codebehind="MultiAttchments.aspx.cs" AutoEventWireup="false" Inherits="WebApplication3.MultiAttchments" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
      <HEAD>
            <script>
            function AddAttachments()
            {
                  document.getElementById('attach').innerText = "继续添加附件";
                 
                  tb = document.getElementById('attAchments');                 
                  newRow = tb.insertRow();
                  newRow.insertCell().innerHTML = "<input name='File' size='50' type='file'>&nbsp;&nbsp;<input type=button value='删除' onclick='delFile(this.parentElement.parentElement.rowIndex)'>";
            }
            function delFile(index)
            {
                  document.getElementById('attAchments').deleteRow(index);
                  tb.rows.length > 0?document.getElementById('attach').innerText = "继续添加附件":document.getElementById('attach').innerText = "添加附件";
            }
            </script>
      </HEAD>
      <body MS_POSITIONING="GridLayout">
            <form id="form1" method="post" runat="server" enctype="multipart/form-data">
            <div><table id="attAchments"></table></div><span><IMG src="icoAddFl.gif"> </span> <A id="attach" style="font-family:宋体;font-size:9pt;" title="如果您要发送多个附件,您只需多次点击“继续添加附件”即可, 要注意附件总量不能超过发送限制的大小。" onclick="AddAttachments();"
                        href="javascript:;" name="attach">添加附件</A>
                  <br><br><br><br><br><br>
                  <asp:Button id="btnSend" runat="server" Text=" 上传 "></asp:Button>
            </form>
      </body>
</HTML>
private void btnSend_Click(object sender, System.EventArgs e)
{
      StringBuilder sb = new StringBuilder();

      int attCount = 0;
      string filePath = "";
            for(int i=0; i< Request.Files.Count; i++)
            {
                  if(Request.Files[i].ContentLength > 0)
                  {
                        filePath = Request.Files[i].FileName;
                        sb.Append("Files" + attCount++ + ": " + filePath + "<br>");
                        Request.Files[0].SaveAs(Server.MapPath("./") + filePath.Substring(filePath.LastIndexOf("\\")+1));
                  }
            }

      sb.Insert(0, "you upload " + attCount + " files.<br>");
      Response.Write(sb.ToString());
}


注意对于超出默认大小的文件需修改配置文件

<configuration>
        <system.web>
              <httpRuntime   maxRequestLength="10000"
                      useFullyQualifiedRedirectUrl="true"
                      executionTimeout="45"/>
          </system.web>
</configuration>
需要将machine.config或web.config中的<httpRuntime>   section的maxRequestLength值作相应的修改.

===========================================
//html文件
<form id="form1" runat="server" >
<div id="fileupload_div"><span>作品:</span>
            <asp:FileUpload ID="FileUpload1" runat="server" />
            <INPUT TYPE="button" VALUE="添加附件" onclick="javascript:AddFile();">
            <INPUT TYPE="button" VALUE="删除附件" onclick="javascript:RemoveFile();">
            <asp:ListBox ID="ListBox1" runat="server" Height="120px" Width="252px"></asp:ListBox>   
        </div>
</form>



// JScript 文件
//注结合jquery+jquery selecte pulgin http://www.texotela.co.uk/code/jquery/select/
function AddFile()
{
    var fileupload=$("input[type=file]")[0];
    if(fileupload.value == "")
    {
        alert("请选择要上传的文件!");
        return;
    }
    var ary = fileupload.value.split("\\");
    var filename = ary[ary.length-1];
    var bAddFile = true;
    if(CheckOptionsExists(filename,$("#ListBox1")[0]))
    {
        alert("文件已经存在列表中!");
        $("#fileupload_div")[0].removeChild(fileupload);
        bAddFile = false;
    }
    var newfile = document.createElement("input");
    newfile.type ="file";
    newfile.name ="file";
    $("#fileupload_div")[0].insertBefore(newfile,$("#fileupload_div")[0].firstChild);
    if(!bAddFile)
    {
    return
    }
    //var o = new Option(filename,fileupload.uniqueID);
    //$("#ListBox1")[0].add(o); //IE only
    $("#ListBox1").addOption(fileupload.uniqueID,filename,false);
    fileupload.style.display = "";
       
}
function CheckOptionsExists(value,ddl)
{
    for(var i=0;i<ddl.options.length;i++)
    {
        if(ddl.options[i].innerText == value)
        {
            return true;
        }
    }
    return false;
}
function RemoveFile()
{
    var lst = $("#ListBox1")[0];
    if(lst.selectedIndex == -1)
    {
        alert("请选择要删除的附件!");
        return;
    }
   
    var id = lst.options[lst.selectedIndex].value;
    //alert( lst.options[lst.selectedIndex].value);
     $("#fileupload_div")[0].removeChild(document.all[id]);
    lst.removeChild(lst.options[lst.selectedIndex]);
     $("#fileupload_div")[0].firstChild.style.display = "";
    
}

posted @ 2011-06-28 09:39 璀璨星辰 阅读(142) 评论(0) 编辑

  

导航

统计

公告