System.IO

             I/O    
 

1.文件操作:File

(1)void AppendAllText(string
path, string contents)

(2)bool Exists(string
path)

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

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

(5)void WriteAllText(string
path, string contents),将文本contents保存到文件path中,会覆盖旧内容。

(6)WriteAllLines(string
path,string[] contents),将字符串数组逐行保存到文件path中,会覆盖旧内容

2.目录操作(文件夹操作):Directory

(1)void Delete(string
path, bool recursive)
,删除目录

(2)bool Exists(string
path)

(3)CreateDirectory,创建文件夹

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

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

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

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

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

3.Path 类常用静态方法

(1)string ChangeExtension(string
path, string extension)
,修改文件的后缀

(2)tring Combine(string
path1, string path2)
,将两个路径合成一个路径

(3)string GetDirectoryName(string
path)
,得到文件的路径名

(4)string GetExtension(string
path)
 ,得到文件的扩展名

(5)string GetFileName(string
path)
,得到文件路径的文件名部分

(6)string GetFileNameWithoutExtension(string
path)
,得到去除扩展名的文件名

(7)string GetFullPath(string
path)
 ,得到文件的全路径

(8)string GetTempFileName() ,得到一个唯一的临时文件名(*)

(9)string GetTempPath()

(10)Assembly.GetExecutingAssembly(),得到当前exe的绝对路径

练习读取和File同目录下的mm.txt文档内容(读取配置的时候经常用到)

4.文件流

(1)FileStream.Read (
)
,从流中读取字节块并将该数据写入给定缓冲区中

(2)练习:文件加密(每一位用255-r)。加密就是解密,解密就是加密

5.如何在程序中访问Access写相对路径——(*了解)

(1)OleDbConnection的连接字符串

(2)在WinForm中如果不修改DataDirectory,则运行时修改的是exe同文件夹下的mdb,而开发人员看的是项目中的mdb

6.文件流高级

(1)文件流的FlushCloseDispose。缓冲区

(2)更方便的用法:File.OpenReadFile.OpenWrite,内部还是new。

(3)Stream类是FileStream类的父类,有MemoryStream(内存流)、GZipStream
(压缩解压流)、CryptoStream (加密流), GZipStream 、 CryptoStream
是装饰者模式的应用。尽量只操作父类Stream。

6.3.1 GZipStream压缩

6.3.2 GZipStream解压

1、文件操作:File


文本文件编码,文本文件有不同的存储方式,将字符串以什么样的形式保存为二进制,这个就是编码,UTF-8、ASCII、Unicode等,如果出现乱码一般就是编码的问题,文本文件相关的函数一般都有一个Encoding类型的参数,

取得编码的方式:Encoding.Default、Encoding.UTF8、Encoding.GetEncoding("GBK")。以什么编码存就以什么编码取就不会乱码。

File类的常用静态方法: 
(1)void AppendAllText(string path, string
contents),

将文本contents附加到文件path中 
(2)bool Exists(string path)

判断文件path是否存在


 1 static void Main(string[] args)
2 {
3 string s = "asasas";
4 if (File.Exists("H:/1.txt"))
5 {
6 Console.WriteLine("文件已经存在,是否覆盖?(Y/N)");
7 string o = Console.ReadLine();
8 if (o=="y")
9 {
10 File.WriteAllText("H:/1.txt",s);
11 }
12 }
13 }

 

结果

 
(3)string[] ReadAllLines(string path)

读取文本文件到字符串数组中


1 string[] s = File.ReadAllLines("H:/1.txt");
2 foreach (var mw in s)
3 {
4 Console.WriteLine(mw);
5 }
6
7 Console.ReadKey();

(4)string ReadAllText(string path)

读取文本文件到字符串中 
(5)void WriteAllText(string path, string
contents)

将文本contents保存到文件path中,会覆盖旧内容。 
(6)WriteAllLines(string path,string[] contents),

将字符串数组逐行保存到文件path中,会覆盖旧内容。

2、目录操作(文件夹操作):Directory


Directory类的常用静态方法:(目录就是文件夹) 
(1)void Delete(string path, bool
recursive)

删除目录, recursive表示是否递归删除,如果recursive为false则只能删除空目录


1 Directory.Delete("H:/test1",true); 

(2)bool Exists(string path)

判断目录是否存在 
(3)CreateDirectory:

创建文件夹

问题:需要在H:/temp1/a.txt写入字符串aabbccdd.

解析:没有目录。


1 string s = "aabbccdd";
2 Directory.CreateDirectory(@"H:\temp1");
3 File.WriteAllText("H:/temp1/a.txt",s);

 

(4)string[] GetDirectories(string
path)

得到一个目录下的子目录


1 string[] files = Directory.GetDirectories(@"c:\");
2 foreach (string file in files)
3 {
4 Console.WriteLine(file);
5 }
6 Console.ReadKey();

 

(5)string[] GetDirectories(string
path, string searchPattern, SearchOption searchOption)

通配符查找目录下的子目录

(6)static string[] GetFiles(string
path)

得到一个目录下的文件

?





1

2

3

4

5

6

string[] files = Directory.GetFiles(@"c:\");

foreach
(string
file in
files)

{

    Console.WriteLine(file);

}

Console.ReadKey();

  

(7)string[] GetFiles(string path,
string searchPattern, SearchOption searchOption)

通配符查找目录下的文件


1 string[] strings = Directory.GetFiles(@"G:\电影\", "*.rmvb", SearchOption.AllDirectories);
2 foreach (string s in strings)
3 {
4 Console.WriteLine(s);
5 }
6 Console.ReadKey();

 

(8)Directory GetParent(string
path)

得到目录的父目录

3.Path类常用静态方法

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

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

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

(2)tring Combine(string path1, string
path2) 
将两个路径合成一个路径,比用+好,可以方便解决是不是加斜线的问题,自动处理路径分隔符的问题 
string
s = Path.Combine(@"c:\temp","a.jpg")

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

(4)string GetExtension(string path)

得到文件的扩展名,例如用来限制用户上传exe的功能

 
(5)string GetFileName(string path)

得到文件路径的文件名部分

 
(6)string GetFileNameWithoutExtension(string
path)

得到去除扩展名的文件名

 
(7)string GetFullPath(string path)

得到文件的全路径。”.\”当前路径,”..\”上一级路径,”..\..\”上一级的上一级

 
(8)string GetTempFileName()

得到一个唯一的临时文件名(*)

(9)string GetTempPath()

得到临时文件夹的路径(*) 
(10)得到当前exe的绝对路径。Assembly.GetExecutingAssembly(),不要用Directory.GetCurrentDirectory(),这个可能会变(使用OpenFileDialog或者SetCurrentDirectory())。(*)解决Access文件路径的问题。

引用反射


1 string loc = Assembly.GetExecutingAssembly().Location;
2 Console.WriteLine(loc);
3 Console.ReadKey();

 

练习:读取和File同目录下的mm.txt文档内容(读取配置的时候经常用到)

4.文件流


1.拷贝文件的两种方式:将源文件内容全部读到内存中,再写到目标文件中;读取源文件的1KB内存,写到目标文件中,再读取源文件的1KB内存,再写到目标文件中……。第二种方式就是一种流(Stream)的操作。

2.用File.ReadAllText、File.WriteAllText进行文件读写是一次性读、写,如果文件非常大会占内存、慢。需要读一行处理一行的机制,这就是流(Stream)。Stream会只读取要求的位置、长度的内容。

FileStream.Read ( )方法
:从流中读取字节块并将该数据写入给定缓冲区中。

Stream.Read(Byte[ ], Int32, Int32)

array类型:System.Byte[ ]  此方法返回时包含指定的字节数组,数组中 offset 和 (offset + count -
1) 之间的值被从当前源中读取的字节替换。

offset类型:System.Int32  array 中的字节偏移量,将在此处开始读取字节。

count类型:System.Int32  最多读取的字节数。

3.就像SqlConnection一样,Stream不会将所有内容一次性读取到内存中,有一个指针,指针指到哪里才能读、写到哪里。


 1 using (FileStream a = new FileStream(@"h:\1111111.7z", FileMode.Create))
2 {
3 using (FileStream fs = new FileStream(@"h:\boce1.7z", FileMode.Open))
4 {
5 byte[] bytes = new byte[1024];
6 int readLength;//实际读出来的长度
7 while ((readLength = fs.Read(bytes, 0, bytes.Length)) > 0)
8 {
9 a.Write(bytes, 0, readLength);
10 }
11 }
12 }
13

4.流有很多种类,文件流是其中一种。FileStream类new FileStream(“c:/a.txt”, filemode,
fileaccess)后两个参数可选值及含义自己看。
FileStream可读可写。可以使用File.OpenRead、File.OpenWrite这两个简化调用方法。

5.练习:文件加密(每一位用255-r)。加密就是解密,解密就是加密。

 1112.7z又可以打开了


 1 private void button1_Click(object sender, EventArgs e)
2 {
3 using (FileStream input = new FileStream(textBox1.Text, FileMode.Open))
4 {
5 using (FileStream output = new FileStream(textBox2.Text, FileMode.Create))
6 {
7 byte[] bytes = new byte[1024 * 1024]; //1M
8 int readLength;
9 while ((readLength = input.Read(bytes, 0, bytes.Length)) > 0)
10 {
11 for (int i = 0; i < readLength; i++) { bytes[i] = (byte)(255 - bytes[i]); }
12 output.Write(bytes,0,bytes.Length);
13 }
14 }
15 }
16 }
17
18

6.byte[]是任何数据的最根本表示形式,任何数据最终都是二进制。

7.Write用于向当前位置写入若干字节,Read用户读取若干字节。(*)每次Read、Write指针都会自动后移。

5.如何在程序中访问Access写相对路径——(*了解)

1、OleDbConnection的连接字符串必须是绝对路径,ADO.Net提供了一个“特殊字符串”
DataDirectory表示“数据库文件夹”,如果是Winform程序DataDirectory表示当前运行的exe的文件夹,对于ASP.Net程序DataDirectory表示当前项目的App_data文件夹。

2、在WinForm中如果不修改DataDirectory,则运行时修改的是exe同文件夹下的mdb,而开发人员看的是项目中的mdb。而正式运行的时候则需要程序操作exe同文件夹下的mdb,因此通过代码修改DataDirectory。代码见备注,这个代码要放到程序最开始运行一次即可。如果是WinForm程序则要放到Main最开始


1 string dataDir = AppDomain.CurrentDomain.BaseDirectory;
2 if (dataDir.EndsWith(@"\bin\Debug\")
3 || dataDir.EndsWith(@"\bin\Release\"))
4 {
5 dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
6 AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
7 }

 

6.文件流高级


(1)文件流的Flush、Close、Dispose。缓冲区


1   string s = "hello";
2 byte[] bytes = Encoding.UTF8.GetBytes(s);
3 fs.Write(bytes, 0, bytes.Length);//FileStream会把数据写入缓冲区
4 //fs.Flush();//强制把缓冲区的中数据写入文件
5 fs.Close(); //会把没写入缓冲区的数据写入文件(Flush)再关闭
6 //Dispose();//会调用colse(),所以调用stream时用using最保险

这样可以,最好还是用using


1 using (FileStream fs = new FileStream(@"H:\1.txt", FileMode.Create))
2 {
3 string s = "hello";
4 byte[] bytes = Encoding.UTF8.GetBytes(s);
5 fs.Write(bytes, 0, bytes.Length);//FileStream会把数据写入缓冲区
6 //fs.Flush();//强制把缓冲区的中数据写入文件
7 //fs.Close(); //会把没写入缓冲区的数据写入文件(Flush)再关闭
8 //Dispose();//会调用colse(),所以调用stream时用using最保险
9 }

 

(2)更方便的用法:File.OpenRead,File.OpenWrite,内部还是new。


1         FileStream ds = File.OpenRead(@"H:\1.txt");//FileMode.Open
2 FileStream ds = File.OpenWrite(@"H:\1.txt");//FileMode.Create

(3)Stream类是FileStream类的父类,有MemoryStream(内存流)、GZipStream
(压缩解压流)、CryptoStream (加密流), GZipStream 、 CryptoStream
是装饰者模式的应用。尽量只操作父类Stream。

6.3.1  压缩


 1 string str = "亲,你好吗?亲,你好吗?亲,你好吗?亲,你好吗?";
2 for (int i = 0; i < 20; i++)
3 {
4 str += str;
5 }
6 using (FileStream fs = File.OpenWrite(@"h:\2.txt"))
7 {
8 byte[] tBytes = Encoding.UTF8.GetBytes(str);
9 fs.Write(tBytes, 0, tBytes.Length);
10 }

 

点击压缩后,


 1 string str = "亲,你好吗?亲,你好吗?亲,你好吗?亲,你好吗?";
2 for (int i = 0; i < 20; i++)
3 {
4 str += str;
5 }
6 using (FileStream fs = File.OpenWrite(@"h:\2.txt"))
7 {
8 //CompressionMode.Compress 压缩
9 using (GZipStream zip = newGZipStream(fs,CompressionMode.Compress))
10 {
11 byte[] tBytes = Encoding.UTF8.GetBytes(str);
12 zip.Write(tBytes, 0, tBytes.Length);
13 }
14 }

 

6.3.2 解压缩


 1 using (FileStream fs = File.OpenRead(@"h:\2.txt"))
2 {
3 using (GZipStream zip =new GZipStream(fs,CompressionMode.Decompress))
4 {
5 using (FileStream outstream = File.OpenWrite(@"h:\2unzip.txt"))
6 {
7 int byteaRead;
8 byte[] bytes=new byte[1024];
9 while ((byteaRead = zip.Read(bytes,0,bytes.Length))>0)
10 {
11 outstream.Write(bytes,0,byteaRead);
12 }
13 }
14 }
15 }
16

(4)只读写文本,不用每次都写代码进行复杂的代码,编写自己的MyStreamReader、编写自己的MyStreamWriter。实现复用。

7.StreamReader


和StreamWriter类似, StreamReader简化了文本类型的流的读取。

ReadToEnd用于从当前位置一直读到最后,内容大的话会占内存;每次调用都往下走,不能无意中调用了两次
ReadLine读取一行,如果到了末尾,则返回null。


 1 private void button1_Click(object sender, EventArgs e)
2 {
3 //StreamReader可以读文件流,压缩流,内存流等等
4 using (Stream fs = File.OpenRead(@"H:\temp1\a.txt"))
5 {
6 string s = "";
7 //因为StreamReader负责在byte[]和string之间转换,
8 //所以需要指定编码(Encoding.UTF8)
9 using (StreamReader stream = new StreamReader(fs,Encoding.UTF8))
10 {
11 //ReadLine读取一行数据,指针自动下移
12 //while ((s = stream.ReadLine()) != null)
13 //{
14 // MessageBox.Show(s);
15 //}
16 s = stream.ReadToEnd();
17 MessageBox.Show(s);
18 }
19 }
20 }

8.StreamWriter


Stream把所有内容当成二进制来看待,如果是文本内容,则需要程序员来处理文本和二进制之间的转换。

用StreamWriter可以简化文本类型的Stream的处理
StreamWriter是辅助Stream进行处理的


 1 private void button2_Click(object sender, EventArgs e)
2 {
3 using (Stream stream = File.OpenWrite(@"H:\temp1\a.txt"))
4 {
5 string s = "";
6 using (StreamWriter writer =new StreamWriter(stream,Encoding.UTF8))
7
8 {
9 writer.WriteLine("Hello");
10 writer.WriteLine("World");
11 writer.WriteLine("!啊");
12 }
13 }
14 }

StreamWriter对Stream进行了包装,调一下writer.WriteLine背后帮我们做了把字符串转换为二进制的工作。

9.WebClient的流操作


WebClient
OpenRead方法打开一个读取流(ReadLine好像有Bug);OpenWrite方法打开一个写入流。
案例:使用WebClient分析读取http服务器上的Excel文件,不用中间文件。
基于流方式进行操作的好处就是不用中间文件,没有安全性问题、没有文件冲突问题。
开发复杂一点程序的原则就是步步为营,不要想着一次写出来,比如这个案例就可以分解为:读取数据库、创建Excel、上传Excel三步,所以先读取数据库,然后WriteLine看看数据有没有被正确的读出来,ok再开发生成Excel的功能,先生成到FileStream中,成功了再最后完成上传到FTP的功能。这也是迭代的开发方式
File.ReadAllLines(),Stream、FileStream、StreamWriter之间的关系,如何分析Xls等二进制数据

10.对象序列化


对象序列化是将对象(比如Person对象)转换为二进制数据,反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。
BinaryFormatter类有两个方法:
void
Serialize(Stream stream, object graph)对象graph序列化到stream中
object
Deserialize(Stream
stream)将对象从stream中反序列化,返回值为反序列化得到的对象
练习:将几个int、字符串添加到ArrayList中,然后序列化到文件中,再反序列化回来。
不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化。
反序列的项目中必须有同样的类,否则不能反序列化。

未完待续。。

转载  
: http://www.cnblogs.com/tangge/archive/2012/10/30/2746458.html

时间: 2024-10-09 10:20:01

System.IO的相关文章

System.IO.File.Create 不会自动释放,一定要Dispose

这样会导致W3P进程一直占用这个文件 System.IO.File.Create(HttpContext.Current.Server.MapPath(strName)) 最好加上Dispose System.IO.File.Create(HttpContext.Current.Server.MapPath(strName)).Dispose()

System.IO 命名空间

System.IO 命名空间的主要目的是为了提供方便访问操作系统的文件和目录类型,另外,也提供写内存和网络流的方法. 这个命名空间提供主要两种方法处理文件和目录,能够使用FileInfo 和 DirectoryInfo 对象获得或修改文件和目录的信息:也能够用File 和 Directory 类实现相同的功能,但是两者都要求传入的文件名为静态成员.通常,如果想要获得文件系统对象的某一项信息,用 File 和 Directory 类:如果想要获得一个文件系统对象的多项信息,用 FileInfo 和

System.IO 二

接着上篇的来  System.IO FileSystemWatcher    指向这个签名的方法   可以监听目录发生了什么事件 例如: static void Main(string[] args) { Console.WriteLine("请开始你的表演:"); FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = @"E:\Test"; //此目录一定需要存在,不然会引发 Arg

System.IO.Path 文件名、路径、扩展名 处理

string filePath [email protected]"E:/Randy0528/中文目录/JustTest.rar"; 更改路径字符串的扩展名.System.IO.Path.ChangeExtension(filePath, "txt");E:/Randy0528/中文目录/JustTest.txt 返回指定路径字符串的目录信息.System.IO.Path.GetDirectoryName(filePath);E:/Randy0528/中文目录 返回

system.io.file创建

在实际开发中,如果用的文件名不能确定位置.或名字.可以使用GUID类来命名函数.Guid 结构标识全局唯一标示符.其NewGuid结构可以初始化一个新历.该方法语法格式如下: public static Guid NewGuid(); return: 初始化后的实例. 源码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Dr

关于 System.IO.FileAttributes 的 Reparse Points

关于Reparse Points找到下面的解释,要是能有更进一步的解释说明就更好了 Reparse Points其实是一个用户自定义的数据集合,它可以包含在一个文件或目录中.这种格式的数据能够被特定的应用程序(负责存储数据)和文件系统过滤程序(负责解释数据和处理文件)所理解.当一个应用程序设置了一个再解析点时,它存储这个数据和再解析标记(唯一标识该数据).当文件系统打开一个含有再解析点的文件时,它会尝试找到再解析标记所标识的文件系统过滤程序.如果文件系统过滤程序被发现,该文件系统过滤程序处理该文

目录操作-SYSTEM.IO

using System; using System.Data; using System.Text; using System.IO; namespace TestApp { class Program { static void Main() { DataSet ds = new DataSet("carRepairs"); string path = Environment.CurrentDirectory; path = Directory.GetParent(path).Fu

使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Combine(string, string, string, string)&#39; is inaccessible due to its protection level

今天用Unity5.5.1开发提取Assets目录的模块,使用时采用System.IO.Path.Combine(string, string, string, string)函数进行路径生成 明明是公有函数,为何会报错,奇了怪了 有谁知道什么原因?欢迎交流 ....... ... 重新打开了一下 ,可以了.版本原因 使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Co

命名空间System.IO

基本介绍:System.IO 命名空间提供读写文件和数据流的类型.基本文件和目录支持的类型. 原文:http://blog.sina.com.cn/s/blog_48a45b950100erhz.html http://edu.cnzz.cn/201510/977513da.shtml 主要的类 字节流:Stream.BufferedStream.MemoryStream.UnmanagedMemoryStream.FileStream 二进制IO流:BinaryReader和BinaryWri

System.IO.FileSystemWatcher

这个类功能很强.可以实时监测文件系统的变化. https://msdn.microsoft.com/zh-cn/library/system.io.filesystemwatcher.aspx 事件 使用不如预期.重复发送消息.结束时并不会发送消息. 例如,拷贝一个文件,在文件拷贝完成后进行操作,但我们无法知道什么时候拷贝操作完成. 拷贝文件时,响应的事件:Created.Changed.Changed(...) 其实,知道这些就已经可以了. 新增文件时,首先收到Created消息.下面我们需要