迫于生计,不得不从C/C++转行学习C#。最近找了一份C#开发的公司工作,目前在疯狂学习C#的语法,由于有C/C++的基础,所以学习起来也不算很难,但是学习到了文件,就觉得学习的压力来了。
今天上班花了一天时间在研究C#文件相关的操作,算是学习到了一点皮毛,现在把今天所学习到的知识点记录下来。
我所接触到的目前有两种:File
与 FileInfo
.
File.Open(文件路径, 文件打开类型);
File.Open(path, FileMode.Open);
它的返回值是文件流类型:Stream、StreamWriter、StreamReader.
代码示例:
FileStream fs = null; // 文件流
StreamWriter fw = null; // 文件流写入器
string path = "file.txt";
// 判断文件是否存在,存在返回true,不存在返回false
if (!File.Exists(path)) {
// 创建文件,文件所在目录:
// 工程文件夹下bin文件夹下debug文件夹中
fs = File.Create(path);
Console.WriteLine("没有{0}该文件,已创建该文件成功", path);
} else {
// 打开文件,以具体的文件打开方式去打开指定文件
fs = File.Open(path, FileMode.Open);
Console.WriteLine("文件打开成功!");
}
其中:
File.Exists(文件名)
:判断文件是否存在,存在返回true,不存在返回false;
File.Create(文件名)
:创建一个文件文件所在目录:工程文件夹下bin文件夹下debug文件夹中;
StreamWriter
:是文件流写入器
FileInfo fi = new FileInfo(文件名);
FileInfo fi = new FileInfo(filePath);
代码示例:
// 实例化FileInfo对象
FileInfo fi = new FileInfo(filePath);
if (!fi.Exists) { // 判断文件是否存在
fi.Create(); // 创建文件
Console.WriteLine("文件已创建!");
} else {
Console.WriteLine("文件已存在!");
}
和 File 的用法基本一致
文件流的对象.Close();
使用流进行对文件的写入与读取
文件名 文件打开方式
FileStream fileStream = File.Open(strFIleName, FileMode.OpenOrCreate);
或者:
// 使用文件流对象去实例化文件流写入器
fs 是 FileStream对象
FileStream fw = new StreamWriter(fs);
代码示例:
FileStream fs = null; // 文件流
StreamWriter fw = null; // 文件流写入器
StreamReader fr = null; // 文件流读取器
string path = "file.txt";
// 判断文件是否存在,存在返回true,不存在返回false
if (!File.Exists(path)) {
// 创建文件,文件所在目录:
// 工程文件夹下bin文件夹下debug文件夹中
fs = File.Create(path);
Console.WriteLine("没有{0}该文件,已创建该文件成功", path);
} else {
// 打开文件,以具体的文件打开方式去打开指定文件
fs = File.Open(path, FileMode.Open);
Console.WriteLine("文件打开成功!");
}
// 使用文件流对象去实例化文件流写入器
fw = new StreamWriter(fs);
fw.WriteLine("将字符串写入文件,并且换行");
fw.Write("将字符串写入文件");
// 文件流读取器,读取文件中的内容
fr = new StreamReader(fs);
string str;
while (fr.Peek() != -1) {
str = fr.ReadLine();
Console.WriteLine("读取到的文件内容是:{0}", str);
}
// 刷新文件中的文本内容,并清空输入缓冲区的数据流
fw.Flush();
// 关闭文件流写入器
fw.Close();
fr.Close();
// 关闭文件流
fs.Close();
}
其中:
fr.Peek() != -1
: 读取文件,当读到文件尾部时结束
fr.ReadLine();
: 读取一行
fw.Flush();
: 刷新文件中的文本内容,并清空输入缓冲区的数据流
// 获取当前目录路径
string dirPath = Directory.GetCurrentDirectory() + "/MyDir";
Console.WriteLine(dirPath);
// 判断目录是否存在,存在返回true,不存在返回false
if (!Directory.Exists(dirPath)) {
// 创建目录
Directory.CreateDirectory(dirPath);
Console.WriteLine("文件夹创建成功!");
} else {
Console.WriteLine("文件夹已存在!");
}
string filePath = dirPath + "/" + "a.txt";
Console.WriteLine(filePath);
/***********************************/
/* 下面是使用FileInfo创建文件 */
// 实例化FileInfo对象
FileInfo fi = new FileInfo(filePath);
if (!fi.Exists) { // 判断文件是否存在
fi.Create(); // 创建文件
Console.WriteLine("文件已创建!");
} else {
Console.WriteLine("文件已存在!");
}
直接看代码吧,我也不知道该怎么写下来!!!
代码中重要部分都有详细注释
// 获取工程目录路径
string dirPath = Directory.GetCurrentDirectory();
// 获取工程目录下的所有文件路径
string[] str = Directory.GetFiles(dirPath);
Console.WriteLine(dirPath + " 文件个数:" + str.Length);
// 输出所有的工程路径下的文件路径
foreach (string s in str) {
Console.WriteLine(s);
}
Seek
// 文件指针定位到起始位置
偏移量 从开始位置
fs.Seek(0, SeekOrigin.Begin);
代码示例:
string filePath = "text.txt";
using (FileStream fs = File.Open(filePath, FileMode.OpenOrCreate)) {
string str = "不是吧,阿sir! yes!";
// 定义字节数组,并将字符串转换为byte类型赋值给它
byte[] strByte = Encoding.UTF8.GetBytes(str);
// 将转换为byte类型的字符串写入文件中
fs.Write(strByte, 0, strByte.Length);
// 定义一个字节数组
byte[] readRead = new byte[strByte.Length];
// 文件指针定位到起始位置
fs.Seek(0, SeekOrigin.Begin);
// 读取文件的一行
fs.Read(readRead, 0, strByte.Length);
// 输出字节数组中的字符串
Console.WriteLine(Encoding.UTF8.GetString(readRead));
}
使用uing
修饰可以自动关闭文件
但是用FileStream
也可以写入和读取文件。
注意:
// 定义字节数组,并将字符串转换为byte类型赋值给它
byte[] strByte = Encoding.UTF8.GetBytes(str);
byte字节输出也需要转换为string类型开会有打印输出效果
Console.WriteLine(Encoding.UTF8.GetString(readRead));
其中:
fs.Seek(0, SeekOrigin.Begin);
:
SeekOrigin.Begin
: 指向流的开头。
SeekOrigin.Current
: 指向当前位置。
SeekOrigin.End
: 指向流的结尾。
这个不会,我把代码写下来,有兴趣的小伙伴自己可以去研究一下。
public void test7() {
string str = "test.txt";
FileInfo info = new FileInfo(str);
FileStream fs = null;
// 如果文件不存在
if (!info.Exists) {
info.Create();
Console.WriteLine("文件创建成功!");
} else {
Console.WriteLine("文件已存在!");
}
fs = new FileStream(str, FileMode.Open, FileAccess.Write, FileShare.None, 4096, true);
string sss = "BeiJing";
byte[] vsByte = Encoding.UTF8.GetBytes(sss);
Console.WriteLine("开始异步!");
IAsyncResult asyncResult = fs.BeginWrite(vsByte, 0, vsByte.Length, new AsyncCallback(callBackFunc), fs);
}
public static void callBackFunc(IAsyncResult asynResult) {
Console.WriteLine("回调函数!");
FileStream stream = asynResult.AsyncState as FileStream;
if (stream != null) {
stream.EndWrite(asynResult);
stream.Close();
Console.WriteLine("异步结束!");
}
}
Mian函数测试和运行及图:
StreamFile streamFile = new StreamFile();
streamFile.test7();
for (int i = 0; i < 1000; i++) {
Console.WriteLine(i);
}
异步就是同步执行两种以上的操作!
好了,差不多就这样了,再深入我也不会了,自己慢慢体会吧!
下班!!!