一、文件操作
1、File类的常用静态方法:
FileInfo类和File类的功能类似,不同的是使用FileInfo类必须实例化对象;如需调用一系列方法,FileInfo类效率更高、更简单(由于File类的静态方法在使用时都会进行安全检查)
2、写一个文本文件:声明一个文件流对象FileStream→创建写入器StreamWriter→写入操作Write()方法或WriteLine()方法→关闭写入器→关闭文件流
string filePath = "D:\\test.txt"; /* // 创建文件流对象 FileStream fs = new FileStream(filePath, FileMode.Create); // 创建读写器 StreamWriter writer = new StreamWriter(fs, Encoding.Default); // 写入操作 writer.WriteLine("文件操作:"); writer.Write("\tFile类和StreamWriter类的结合使用!"); // 关闭读写器 writer.Close(); // 关闭文件流 fs.Close(); */ // 简化 // 创建文件流对象 using (FileStream fs = new FileStream(filePath, FileMode.Create)) { // 创建读写器 using (StreamWriter writer = new StreamWriter(fs, Encoding.Default)) { // 写入操作 writer.WriteLine("文件操作:"); writer.Write("\tFile类和StreamWriter类的结合使用!"); } }
3、读取文本文件:声明一个文件流对象FileStream→创建读取器StreamReader→读操作ReadLine()或ReadToEnd()→关闭读取器→关闭文件流
/* // 创建文件流对象 FileStream fs = new FileStream(filePath, FileMode.Open); // 创建读写器 StreamReader reader = new StreamReader(fs, Encoding.Default); // 读取操作 //string content = reader.ReadToEnd(); //Console.WriteLine(content); string content = ""; string contentLine = reader.ReadLine(); while (contentLine != null) { content = content + contentLine + "\r\n"; contentLine = reader.ReadLine(); } Console.WriteLine(content); // 关闭读写器 reader.Close(); // 关闭文件流 fs.Close(); */ // 简化 // 创建文件流对象 using (FileStream fs = new FileStream(filePath, FileMode.Open)) { // 创建读写器 using (StreamReader reader = new StreamReader(fs, Encoding.Default)) { //string content = reader.ReadToEnd(); string content = ""; string contentLine = reader.ReadLine(); while (contentLine != null) { content = content + contentLine + "\r\n"; contentLine = reader.ReadLine(); } Console.WriteLine(content); } }
二、目录操作
1、Directory类的常用静态方法:(目录就是文件夹)
DirectoryInfo类
2、判断该路径是文件还是文件夹
string path = "D:\\test.txt"; // 方式一 if (File.GetAttributes(path).CompareTo(FileAttributes.Directory) == 0) { Console.WriteLine("文件夹"); } else { Console.WriteLine("文件"); } // 方式二 if (File.Exists(path)) { Console.WriteLine("文件"); } else if (Directory.Exists(path)) { Console.WriteLine("文件夹"); }
3、创建目录、复制目录和删除目录
/// <summary> /// 创建目录,可以直接Directory.CreateDirctory(string dirPath),或使用以下方法 /// </summary> /// <param name="path"></param> public static void CreateDirtory(string path) { if (!File.Exists(path)) { string[] dirArray = path.Split(‘\\‘); string temp = string.Empty; for (int i = 0; i < dirArray.Length - 1; i++) { temp += dirArray[i].Trim() + "\\"; if (!Directory.Exists(temp)) Directory.CreateDirectory(temp); } } } /// <summary> /// 文件夹的复制 /// </summary> /// <param sourceDir="string">要复制的原路径</param> /// <param targetDir="string">要复制的目的路径</param> /// <param name="overwrite">若为true,则允许覆盖现有文件;否则为false</param> /// <param name="copySubDir">是否复制子目录</param> public static void DirectoryCopy(string sourceDirPath, string targetDirPath, bool overwrite, bool copySubDir) { DirectoryInfo sourceDirInfo = new DirectoryInfo(sourceDirPath); try { if (!sourceDirInfo.Exists)//判断所指的文件或文件夹是否存在 { return; } if (!Directory.Exists(targetDirPath)) { Directory.CreateDirectory(targetDirPath); } // 获取文件夹中所有文件和文件夹 FileSystemInfo[] sourceFiles = sourceDirInfo.GetFileSystemInfos(); // 对单个FileSystemInfo进行判断,如果是文件夹则进行递归操作 foreach (FileSystemInfo sourceFileSys in sourceFiles) { FileInfo file = sourceFileSys as FileInfo; if (file != null) // 如果是文件的话,进行文件的复制操作 { string targetFilePath = Path.Combine(targetDirPath, file.Name); if (File.Exists(targetFilePath) && overwrite) { File.SetAttributes(targetFilePath, FileAttributes.Normal); } file.CopyTo(targetFilePath, overwrite); // 将文件复制到指定的路径中 } else { if (copySubDir) { DirectoryCopy(sourceFileSys.FullName, Path.Combine(targetDirPath, sourceFileSys.Name), overwrite, copySubDir); } } } } catch (Exception ex) { throw ex; } } /// <summary> /// 删除指定的目录 /// </summary> /// <param name="dirPath">目录路径</param> /// <param name="isDelSelf">是否删除本身:true为删除指定目录,false为删除指定目录下的所有目录、子目录和文件</param> public static void DeleteDirectory(string dirPath, bool isDelSelf) { if (Directory.Exists(dirPath)) { if (isDelSelf) { Directory.Delete(dirPath, true); } else { foreach (string content in Directory.GetFileSystemEntries(dirPath)) { if (Directory.Exists(content)) Directory.Delete(content, true); else if (File.Exists(content)) File.Delete(content); } } } }
三、文件路径
Path类常用静态方法:
得到当前exe的路径。Assembly.GetExecutingAssembly().Location得到exe的全路径,Path.GetDirectoryName得到目录路径,不要用Directory.GetCurrentDirectory(),这个可能会变(使用OpenFileDialog或者SetCurrentDirectory())。
AppDomain.CurrentDomain.BaseDirectory;
// 获取当前程序的目录
Application.StartupPath //
获取当前程序的目录
System.Environment.CurrentDirectory //
获取当前程序的目录,与Directory.GetCurrentDirectory()一样可能会变(使用OpenFileDialog或者SetCurrentDirectory())。参考:http://www.cnblogs.com/mayswind/archive/2013/06/12/3119570.html
四、文件属性
string filePath = "D:\\test.txt"; // 使用File Console.WriteLine(File.GetAttributes(filePath)); File.SetAttributes(filePath, FileAttributes.Hidden | FileAttributes.ReadOnly); Console.WriteLine(File.GetAttributes(filePath)); // 使用FilInfo FileInfo fi = new FileInfo(filePath); Console.WriteLine(fi.Attributes.ToString()); fi.Attributes = FileAttributes.Hidden | FileAttributes.ReadOnly; //隐藏与只读 Console.WriteLine(fi.Attributes.ToString()); //只读与系统属性,删除时会提示拒绝访问 fi.Attributes = FileAttributes.Archive; Console.WriteLine(fi.Attributes.ToString());
五、文件流
1、BitConverter类:将基础数据类型与字节数组相互转换
int value = 12345678; byte[] bytes = BitConverter.GetBytes(value); Console.WriteLine(BitConverter.ToString(bytes));
2、字符串和字节数组转换
string filePath = "D:\\test.txt"; string content = "好好学习,天天向上!"; using (FileStream fs = new FileStream(filePath, FileMode.Create)) { // 将字符串转成byte数组 byte[] bytes = Encoding.UTF8.GetBytes(content); // 写入文件 fs.Write(bytes, 0, bytes.Length); } using (FileStream fs = new FileStream(filePath,FileMode.Open)) { byte[] bytes = new byte[1024 * 1024]; int length = fs.Read(bytes, 0, bytes.Length); if (length > 0) { string readContent = Encoding.UTF8.GetString(bytes,0,length); Console.WriteLine(readContent); } }
2、读写文件
using (FileStream writeStream = new FileStream(@"D:\test.zip", FileMode.Create)) { using (FileStream readStream = new FileStream(@"D:\rar.zip", FileMode.Open)) { // Read返回值表示实际读了多少内容 byte[] bytes = new byte[1024 * 1024];//缓冲区的大小。 // 缓冲区太小的话速度慢,伤硬盘 // 如果Read返回值大于0,说明还没有读完;如果已读完,则为零 int readBytes;// 实际读出的长度 while ((readBytes = readStream.Read(bytes, 0, bytes.Length)) > 0) { writeStream.Write(bytes, 0, readBytes); } } }
原文:http://www.cnblogs.com/lusunqing/p/3548327.html