C#程序设计.唐大仕.06.文件与流

文件与流

1. IO及流

System.IO

1
using System.IO;
  • 提供了许多用于文件和数据流进行读写操作的类

流的分类

  • Stream 类
    • 按存取位置分
      • FileStream、MemoryStream、BufferedStream
  • 读写类
    • BinaryReader、BinaryWriter
    • TextReader、TextWriter
      • StreamReader、StreamWriter
      • StringReader、StringWriter
  • 示例
1
2
FileStream fs = new FileStream(@"c:\foo.txt", FileMode.Create);
StreamWriter writer = new StreamWriter(fs);

System.IO 的常用类

2. 文件及目录

文件和文件夹管理

  • 对文件和文件夹操作的类
功能
FileInfo 具体的文件
File 提供 static 方法
DirectoryInfo 具体的文件夹
Directory 提供 static 方法
FileSystemInfo FileInfo 及 DirectoryInfo 的父类
Path 文件路径类

文件及文件夹的信息

  • FileInfo 对象可以获取文件大小等各种信息
  • DirectoryInfo 对象可以获取文件夹大小等各种信息

FileInfo

  • 建立对象
1
new FileInfo("文件物理路径");
  • 常用属性
属性 功能
Name 文件名称
Extension 文件扩展名
FullName 文件完全路径(物理路径)
Length 文件大小,单位为字节
CreationTime 文件创建时间
LastAccessTime 文件上次访问时间
LastWriteTime 文件上次修改时间
DirectoryName 所在文件夹
Attributes 文件属性,如只读、隐藏等

DirectoryInfo

  • 建立该对象
1
new DirectoryInfo(文件物理路径);
  • 常用属性
属性 功能
Name 文件夹名称
FullName 文件夹完全路径(物理路径)
CreationTime 文件夹创建时间
LastAccessTime 文件夹上次访问时间
LastWriteTime 文件夹上次修改时间
Parent 父文件夹
Root 所在根目录

文件操作

  • File 类的 static 方法
1
2
3
4
5
6
File.Create(filePath);
File.Copy(filePath1,filePath2);
File.Move(filePath1,filePath2);
File.Delete(filePath);
File.Exists(filePath);
File.CreateText(filePath);
  • Directory 的 static 方法
1
2
3
4
5
6
Directory.CreateDirectory(DirPath);
Directory.Move(DirPath1,DirPath2);
Directory.Delete(DirPath);
Directory.Exists(DirPath);
Directory.GetDirectories(DirPath);
Directory.GetFiles(DirPath);

子文件

  • 显示指定文件夹下的子文件夹和子文件
  • Directory
    • GetDirectories 和 GetFiles的 static 方法
  • DirectoryInfo
    • GetDirectories 和 GetFiles实例方法
    • 这两个方法分别返回 DirectoryInfo 对象数组和 FileInfo 对象数组

Path

  • 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static string ChangeExtension(string path, string extension);
public static string Combine(string path1, string path2, string path3);
public static string Combine(string path1, string path2);
public static string Combine(string path1, string path2, string path3, string path4);
public static string Combine(params string[] paths);
public static string GetDirectoryName(string path);
public static string GetExtension(string path);
public static string GetFileName(string path);
public static string GetFileNameWithoutExtension(string path);
public static string GetFullPath(string path);
public static char[] GetInvalidFileNameChars();
public static char[] GetInvalidPathChars();
public static string GetPathRoot(string path);
public static string GetRandomFileName();
public static string GetTempFileName();
public static string GetTempPath();
public static bool HasExtension(string path);
public static bool IsPathRooted(string path);

示例:递归查看所有文件

文件监视器

  • 很有趣的功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.IO;
public class Watcher {
public static void Main() {
const string path = @"D:\Code\C_plus_plus\";
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.Filter = "*.cpp";
watcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite | NotifyFilters.FileName |
NotifyFilters.DirectoryName;
// 事件处理函数
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// 开始监视
watcher.EnableRaisingEvents = true;
// 等用户输入 q 才结束程序
Console.WriteLine("Press'q' to quit the sample.");
while (Console.Read() != 'q') ;
}
// 事件处理函数.
public static void OnChanged(object source, FileSystemEventArgs e) {
// 显示哪些文件做了何种修改
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
public static void OnRenamed(object source, RenamedEventArgs e) {
// 显示被更改的文件名
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}
}

3. 文件内容处理

文本文件的操作

  • StreamReader、StreamWriter
1
2
3
4
5
6
7
8
9
10
11
12
new StreamReader("文件路径", FileEncode);
ReadLine();
ReadToEnd();
Read();
Peek();
Close();

new StreamWriter("文件路径", FileMode, FileEncode)
WriteLine();
Write();
Flush();
Close();

二进制文件的操作

  • FileStream
1
2
3
new FileStream("文件路径", FileMode, FileAccess);
Seek();
Read();

示例代码

1
2
3
4
5
6
7
8
9
try {
string fname = LogFile;
StreamWriter writer =
new StreamWriter(fname, true, System.Text.Encoding.Default);
// ...
writer.Close();
} catch {
// ...
}
1
2
3
4
5
6
// 利用 FileStream 构造 StreamReader
FileStream fin = new FileStream(infname, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outfname, FileMode.Create, FileAccess.Write);

StreamReader brin = new StreamReader(fin, System.Text.Encoding.Default);
StreamWriter brout = new StreamWriter(fout, System.Text.Encoding.Default);
  • BmpFileReader
    • 读取二进制文件
    • 里面有 24 位位图的格式

序列化与反序列化

  • 在对象上使用 [Serializble]
  • 使用 BinaryFormatter 或 XmlSerializer 进行序列化
  • SerializationTest
    • BinaryFormatter

4. 注册表操作

什么是注册表

  • 存放计算机运行方式的配置信息的树状表
  • 其中包括 Windows 操作系统配置信息、应用程序配置信息、专用用户设备配置信息、环境配置信息等

打开注册表

  • 命令行
1
regedit

编程相关类

1
using Microsoft.Win32;
  • Registry、RegistryKey
    • 它们都是 sealed 类,即不能被继承
  • 编程实例