文件操作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();
}
}
posted on 2011-07-04 14:01  高兴happy  阅读(408)  评论(0编辑  收藏  举报