zoukankan      html  css  js  c++  java
  • 文件操作

    文件操作File

    • File类的常用静态方法:

    –  void AppendAllText(string path, string contents),将文本contents附加到文件path中

    –  bool Exists(string path)判断文件path是否存在

    –  string[] ReadAllLines(string path) 读取文本文件到字符串数组中

    –  string ReadAllText(string path) 读取文本文件到字符串中

    –  void WriteAllText(string path, string contents)将文本contents保存到文件path中

    *********************************************************************************************

    目录操作

    • Directory类的常用静态方法:(目录就是文件夹)

    –  void Delete(string path, bool recursive)     删除目录, recursive表示是否递归删除

    –  bool Exists(string path)      判断目录是否存在

    –  string[] GetDirectories(string path)  得到一个目录下的子目录

    –  string[] GetDirectories(string path, string searchPattern, SearchOption searchOption)    通配符查找目录下的子目录

    –  static string[] GetFiles(string path)  得到一个目录下的文件

    –  string[] GetFiles(string path, string searchPattern, SearchOption searchOption)   通配符查找目录下的文件

    –  DirectoryInfo GetParent(string path)  得到目录的父目录

    ************************************************************************************************************

    Path类常用静态方法

    • string ChangeExtension(string path, string extension) (*)

    –  修改文件的后缀,“修改”支持字符串层面的,没有真的给文件改名

    –  string s = Path.ChangeExtension(@"C:\temp\F3.png", "jpg")

    • string Combine(string path1, string path2)

    –  将两个路径合成一个路径,比用+好,可以方便解决是不是加斜线的问题,自动处理路径分隔符的问题

    –  string s = Path.Combine(@"c:\temp","a.jpg")

    • string GetDirectoryName(string path) (*)

    –  得到文件的路径名。Path.GetDirectoryName(@"c:\temp\a.jpg")

    • string GetExtension(string path) 得到文件的扩展名
    • string GetFileName(string path) 得到文件路径的文件名部分
    • string GetFileNameWithoutExtension(string path) 得到去除扩展名的文件名
    • string GetFullPath(string path) 得到文件的全路径。”.\”当前路径,”..\”上一级路径,”..\..\”上一级的上一级
    • string GetTempFileName()  得到一个唯一的临时文件名(*)
    • string GetTempPath() 得到临时文件夹的路径(*)

    *********************************************************************************************************

    拷贝文件:、基于Stream的大文件拷贝

    • 用Stopwatch测试拷贝一个200MB的文件,lengthEachTime=1024的时候28秒, lengthEachTime=1024000的时候4秒。每次拷贝的字节数越多速度越快,太多了就有太占内存。因为每次拷贝、写都会导致磁头的启动、刹车,一次读写的越多启动、刹车次数一般越少。(*)File.Copy没法控制每次读写的字节数
    • CopyStream里为什么用Stream类型,不用FileStream?因为Stream就定义了Read、Write等方法,“能用抽象类的就不要用具体类”。Stream的子类还有MemoryStream、NetWorkStream、SqlFileStream等,用CopyStream函数不仅可以在同类型Stream之间拷贝,还可以在不同类型Stream之间拷贝,这就是多态、基于抽象类基于接口编程的好处。.Net4.0内置了CopyStream方法。

    ********************************************************************************************************

    IO拷贝大文件

    View Code
    //实际做项目的时候除非有特殊要求,否则用File.Copy做文件拷贝就行了
    ///<summary>
    /// 拷贝文件
    ///</summary>
    ///<param name="fromFile">源文件路径</param>
    ///<param name="toFile">目标文件路径</param>
    ///<param name="lengthEachTime">拷贝大小如(1024,一次读取1024B即1K)</param>
    publicstaticvoid CopyFile(string fromFile, string toFile, int

    lengthEachTime)
    {
    //FileStream继承自Stream类,Stream类实现了IDisposable接口
    using (Stream fsFrom =new FileStream(fromFile,

    FileMode.Open, FileAccess.Read))
    {
    using (Stream fsTo =new FileStream(toFile,

    FileMode.Create, FileAccess.Write))
    {
    CopyStream(fsFrom, fsTo, lengthEachTime);
    }
    }
    }
    //CopyStream参数是Stream类型的“能用抽象类、父类就不要用具体子类,能用接口就不要用具体类”
    //Stream类型足够了
    privatestaticvoid CopyStream(Stream fsFrom, Stream fsTo, int

    lengthEachTime)
    {
    int lengthToCopy;
    if (lengthEachTime < fsFrom.Length)//如果分段拷贝,即每次拷贝内容小于文件总长度
    {
    byte[] buffer =newbyte[lengthEachTime];
    int copied =0;
    while (copied <= ((int)fsFrom.Length -

    lengthEachTime))
    //拷贝主体部分
    {
    lengthToCopy
    = fsFrom.Read(buffer, 0,

    lengthEachTime);
    fsTo.Write(buffer,
    0, lengthEachTime);
    fsTo.Position
    = fsFrom.Position;//每次写的时候都是向指针的位置来写,所以需要写一下挪动一下指针的位置
    copied += lengthToCopy;
    }
    int left = (int)fsFrom.Length - copied;//拷贝剩余部分
    lengthToCopy = fsFrom.Read(buffer, 0, left);
    fsTo.Write(buffer,
    0, left);
    }
    else//如果整体拷贝,即每次拷贝内容大于文件总长度
    {
    byte[] buffer =newbyte[fsFrom.Length];
    fsFrom.Read(buffer,
    0, (int)fsFrom.Length);
    fsTo.Write(buffer,
    0, (int)fsFrom.Length);
    }
    }

    IO流下载文件

    View Code
    ///<summary>
    /// IO流下载文件
    ///</summary>
    ///<param name="UserName">ftp用户名</param>
    ///<param name="Password">ftp密码</param>
    ///<param name="IPfrom">下载ftp文件地址(ftp://127.0.0.1/1.txt)</param>
    ///<param name="IPto">保存路径(@"c:\2.txt")</param>
    publicvoid StreamDown(string UserName,string Password,string IPfrom,string IPto)
    {
    using (WebClient webclient =new WebClient())
    {
    webclient.Credentials
    =new NetworkCredential(UserName, Password);
    using (Stream stream = webclient.OpenRead(IPfrom))//不管Stream具体是什么类型,基于抽象类编程
    {
    using (StreamReader reader =new StreamReader(stream, Encoding.Default))
    {
    using (Stream streamTo =new FileStream(IPto, FileMode.Create, FileAccess.Write))
    {
    using (StreamWriter writer =new StreamWriter(streamTo, Encoding.Default))
    {
    string line;
    try
    {
    while ((line = reader.ReadLine()) !=null)//WebClient的Bug:读取到最后一行的时候不是按照Stream的要求返回null,而是关闭了Stream。
    {
    writer.WriteLine(line);
    }
    }
    catch (ObjectDisposedException ode)
    {

    }
    }
    }
    }
    }

    }

    }

    IO下载文件

    • OpenRead方法打开一个读取流(ReadLine好像有Bug);OpenWrite方法打开一个写入流

    显示来自网站的图片。技术点提示,将流中的图片显示到界面上:pictureBox1.Image = new Bitmap(stream)。

    View Code
    ///<summary>
    /// IO流上传文件
    ///</summary>
    ///<param name="UserName">ftp用户名</param>
    ///<param name="Password">ftp密码</param>
    ///<param name="IPfrom">上传到ftp文件地址(ftp://127.0.0.1/3.txt)</param>
    ///<param name="IPto">源文件地址路径(c:\1.txt)</param>
    publicvoid StreamUp(string UserName, string Password, string IPfrom, string IPto)
    {
    using (WebClient webclient =new WebClient())
    {
    webclient.Credentials
    =new NetworkCredential(UserName, Password);
    using (Stream streamto = webclient.OpenWrite(IPto))//不管Stream具体是什么类型,基于抽象类编程
    {
    using (StreamWriter writer =new StreamWriter(streamto, Encoding.Default))
    {
    using (Stream streamfrom = webclient.OpenRead(IPfrom))//不管Stream具体是什么类型,基于抽象类编程
    {
    using (StreamReader reader =new StreamReader(streamfrom, Encoding.Default))
    {
    string line;
    try
    {
    while ((line = reader.ReadLine()) !=null)//WebClient的Bug:读取到最后一行的时候不是按照Stream的要求返回null,而是关闭了Stream。
    {
    writer.WriteLine(line);
    }
    }
    catch (ObjectDisposedException ode)
    {

    }
    }
    }
    }
    }
    }
    }

    IO压缩解压文件流

    GZipStream采用的就是装饰者模式, writer让它写一个100KB的字符串,它将数据压缩成1KB的内容再传给它装饰的Stream写入。 GZipStream 甚至还可以装饰另外一个GZipStream,进行多次压缩。

    解压。

    View Code
    ///<summary>
    /// 压缩文件流
    ///</summary>
    ///<param name="Path">要压缩的文件路径(@"c:\1.txt")</param>
    publicvoid zipStream(string Path)
    {
    using (Stream stream =new FileStream(Path, FileMode.Open, FileAccess.Read))
    {
    using (Stream zipStream =new GZipStream(stream, CompressionMode.Compress))//Compress压缩
    {
    using (StreamWriter writer =new StreamWriter(zipStream))
    {
    for (int i =0; i <100; i++)
    {
    writer.WriteLine(
    "你好");
    }
    }
    }
    }
    }
    ///<summary>
    /// 解压文件流
    ///</summary>
    ///<param name="Path">要解压的文件流路径(@"c:\1.txt")</param>
    publicvoid GZipStream(string Path)
    {

    using (Stream stream =new FileStream(Path, FileMode.Open, FileAccess.Read))
    {
    using (Stream zipStream =new GZipStream(stream, CompressionMode.Decompress))//Decompress解压缩
    {
    using (StreamReader reader =new StreamReader(zipStream))
    {
    //打印
    Console.WriteLine(reader.ReadToEnd());
    }
    }
    }


    Console.ReadKey();

    }

    IOStream流到处excel(NPOI)

      将数据库中的数据导出到FTP上的Excel文件,不用临时文件,不用强类型DataSet。

    数据库:T_Persons(Id、Name、Age)三个字段,填一些内容进去,然后连接数据库、读取表的内容,然后用WebClient的OpenWrite打开一个写入流,然后用HSSFWorkbook的Write方法将创建的xls写入FTP。

    把ADO.Net、NPOI、WebClient流三者的一个结合

    步骤:创建一个mdf文件,新建T_Persons表,填入初始数据,创建SqlConnection(连接字符串:"Data Source=HAPPY-THINK;User ID=sa;Password=happy;database=test0530;Connection Reset=FALSE;Max Pool Size = 512;"。注意用接口编程方式)。导入NPOI的dll,创建一个HSSFWorkbook,读取表内容,一行行的CreateRow并且添加内容,添加完毕后创建WebClient,调用OpenWrite方法打开上传流,调用Workbook的Write方法将Excel写入到上传流中

    View Code
    class Program
    {
    staticvoid Main(string[] args)
    {
    HSSFWorkbook workbook
    =new HSSFWorkbook();
    HSSFSheet sheet
    = workbook.CreateSheet();
    using (IDbConnection conn =new SqlConnection(@"Data Source=HAPPY-THINK;User ID=sa;Password=happy;database=test0530;Connection Reset=FALSE;Max Pool Size = 512;"))
    {
    conn.Open();
    using (IDbCommand cmd = conn.CreateCommand())
    {
    cmd.CommandText
    ="select * from T_Persons";
    int i =0;
    using (IDataReader dataReader = cmd.ExecuteReader())
    {
    while (dataReader.Read())
    {
    string name = dataReader.GetString(dataReader.GetOrdinal("Name"));
    int age = dataReader.GetInt32(dataReader.GetOrdinal("Age"));
    HSSFRow row
    = sheet.CreateRow(i);//使用计数器i来标记当前是第几行
    i++;
    row.CreateCell(
    0).SetCellValue(name);
    row.CreateCell(
    1).SetCellValue(age);
    //Console.WriteLine("{0}={1}",name,age);//第一步的成果检验
    }
    }
    }
    }

    using (WebClient webclient =new WebClient())
    {
    webclient.Credentials
    =new NetworkCredential("admin","123");
    using (Stream uploadStream = webclient.OpenWrite("ftp://127.0.0.1/test.xls"))
    {
    workbook.Write(uploadStream);
    //将创建的Excel workbook保存到上传流中
    }
    }
    Console.ReadKey();
    }
    }
  • 相关阅读:
    20+ 个高质量的 Web 按钮设计 PSD 下载
    12 月份 10 个新鲜的 jQuery 插件和教程
    20+ 个有用的 Google 地图的 jQuery 插件和教程
    5个界面效果很炫的JavaScript UI框架
    分享50个使用非比寻常导航菜单设计的创20111227creati意网站
    8 款为 WordPress 文章生成缩略图的插件
    百万级访问量网站的技术准备工作
    推荐8个独特应用的JQuery拖放插件
    开源软件发展史【信息图】
    iOS应用开发应遵循的10条设计原则
  • 原文地址:https://www.cnblogs.com/happygx/p/2097354.html
Copyright © 2011-2022 走看看