目录导航

1.0开启文件隐藏属性

1.1开启文件夹只读属性

1.2输出子文件夹路径

1.3统计文件数目

1.4批量重命名文件

1.5分割文件

1.6拼接文件

1.7读取用逗号分割的值

1.8读写压缩数据

1.9替换字符串

2.0将EXCEL文件转化成CSV(逗号分隔)的文件,用文件流读取(等价就是读取一个txt文本文件)

  1.  

1.0开启文件隐藏属性

  1. string fileName = "text.txt";
  2. if (!File.Exists(fileName))//判断文件是否存在
  3. {
  4. File.Create(fileName);//创建一个文本文件
  5. }
  6. //判断文件夹是否已经具有隐藏属性
  7. if ((File.GetAttributes(fileName)&FileAttributes.Hidden)!=FileAttributes.Hidden)
  8. {
  9. File.SetAttributes(fileName, FileAttributes.Hidden);//将文本文件隐藏属性开启
  10. }

1.1开启文件夹只读属性

  1. string directoryName = "test";
  2. if (!Directory.Exists(directoryName))//判断文件夹是否存在
  3. {
  4. Directory.CreateDirectory(directoryName);//创建文件夹
  5. }
  6. //获取文件夹访问控制列表
  7. DirectorySecurity dirSecurity = Directory.GetAccessControl(directoryName);
  8. //将指定访问控制列表添加到当前文件夹
  9. dirSecurity.AddAccessRule(new FileSystemAccessRule("Admin", FileSystemRights.Read, InheritanceFlags.None, PropagationFlags.InheritOnly, AccessControlType.Allow));//这里的 Admin 字符串是 系统的用户名,否则会报错
  10. Directory.SetAccessControl(directoryName, dirSecurity);//设置文件夹访问控制列表

1.0与1.1 比较

不同之处: 一个是文件一个是文件夹,所以在判断文件和文件夹是否存在的时候 用的类不同 ,分别是File 和 Directory

下面对这两个类给个初步说明

File        :提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 System.IO.FileStream 对象。

Directory:公开用于创建、移动和枚举通过目录和子目录的静态方法。 此类不能被继承。

处理文件会经常使用这2个类

1.2 输出子文件夹路径

  1. static void Main(string[] args)
  2. {
  3. string path = @"D:\study\2015年\文件系统\01\01";
  4. DisplayDirectories(path);
  5. }
  6. static void DisplayDirectories(string path)
  7. {
  8. DirectoryInfo directoryInfo = new DirectoryInfo(path);
  9. Console.WriteLine(directoryInfo.FullName);//输出文件夹信息
  10. foreach (DirectoryInfo DI in directoryInfo.GetDirectories())
  11. {
  12. DisplayDirectories(DI.FullName);//输出子文件夹信息
  13. }
  14. }

这里介绍下 DirectoryInfo 类  :公开用于创建、移动和枚举目录和子目录的实例方法。 此类不能被继承。

1.3统计文件数目

  1. static void Main(string[] args)
  2. {
  3. string path = @"D:\study\2015年\文件系统\01\01";
  4. Console.WriteLine("路径{0}下的文件数目为{1}", path, GetFileCount(path));
  5. }
  6. static int GetFileCount(string path)
  7. {
  8. int count = ; //文件数目
  9. DirectoryInfo directoryInfo = new DirectoryInfo(path);//路径信息
  10. count += directoryInfo.GetFiles().Length;
  11. foreach (var item in directoryInfo.GetDirectories())//获取路劲下的子目录
  12. {
  13. count += GetFileCount(item.FullName);//获取子目录中的文件数目
  14. }
  15. return count;
  16. }

1.4批量重命名文件

  1. //先创建文件
  2. Random random = new Random();
  3. string path = Directory.GetCurrentDirectory();//获取当前路径创建10个随机命名的文件
  4. for (int i = ; i < ; i++)
  5. {
  6. File.CreateText(path + "\\" + random.Next(int.MaxValue) + ".txt").Close();
  7. }
  8. DirectoryInfo directoryInfo = new DirectoryInfo(path);//创建当前目录信息类实例
  9. Console.WriteLine("当前目录下的文本文件有:");
  10. foreach (FileInfo file in directoryInfo.GetFiles("*.txt"))
  11. {
  12. Console.WriteLine(file.Name);
  13. }
  14. //对文件重命名
  15. Console.WriteLine("对当前目录下的文本文件重命名:");
  16. foreach (FileInfo file in directoryInfo.GetFiles("*.txt"))
  17. {
  18. string newName = random.Next(int.MaxValue).ToString();
  19. Console.WriteLine("将{0}重命名为{1}", file.Name, newName + ".txt");
  20. File.Move(file.Name, newName + ".txt");
  21. }

 

1.5分割文件

  1. //创建文本文件
  2. string fileName = Directory.GetCurrentDirectory() + "\\zhiniao.txt";
  3. StreamWriter writer = File.CreateText(fileName);//创建文本文件写入流类实例
  4. for (int i = ; i < ; i++)
  5. {
  6. writer.Write("zhiniao ");//**这里有个小异常没有解决,望有心人看见给予帮助?
  7. }
  8. writer.Close();
  9.  
  10. //以文件流的形式打开 zhiniao.txt, 将其按指定大小分割
  11. FileStream fileStream = new FileStream(fileName, FileMode.Open);//创建文件流类型
  12. Console.WriteLine("文件{0}的长度为{1}字节", fileStream.Name, fileStream.Length);
  13. Console.WriteLine("请输入需要分割文件的长度:");
  14. int subLength = int.Parse(Console.ReadLine());//分割后子文件的长度
  15. byte[] buffer = new byte[subLength];
  16. Console.WriteLine("分割后的文件的路径:");
  17. int subCount = (int)(fileStream.Length + subLength - ) / subLength;//分割后子文件的数量
  18. for (int i = ; i < subCount; i++)
  19. {
  20. int readLength = fileStream.Read(buffer, , subLength);//读取的字节数
  21. string subName = fileStream.Name + "." + i + ".txt";
  22. FileStream subFile = File.Create(subName);//创建子文件
  23. subFile.Write(buffer, , readLength);//写入子文件
  24. subFile.Close();
  25. Console.WriteLine("文件{0}\t的长度{1}字节",subName,readLength);
  26. }
  27. fileStream.Close();

这里有个小异常没有解决,望有心人看见给予帮助? 异常消息:system.invalidoperationexception  此流上不支持超时

 

1.6拼接文件

  1. //创建文本文件
  2. string fileName = Directory.GetCurrentDirectory() + "\\zhiniao.txt";
  3. FileStream file = File.Create(fileName);//创建主文件
  4.  
  5. int subIndex = ;//子文件索引
  6. while (File.Exists(file.Name + "." + subIndex + ".txt"))
  7. {
  8. //打开子文件流
  9. FileStream subFile = new FileStream(file.Name + "." + subIndex + ".txt", FileMode.Open);
  10. byte[] buffer = new byte[subFile.Length];//子文件缓存
  11. int readLength = subFile.Read(buffer, , buffer.Length);//读取子文件
  12. file.Write(buffer, , readLength);
  13. subFile.Close();
  14. subIndex++;
  15. }
  16. file.Close();
  17.  
  18. StreamReader reader = new StreamReader(fileName);
  19. Console.WriteLine(reader.ReadToEnd());
  20. reader.Close();

 

1.7读取用逗号分割的值

读取前                  读取后         

  1. static List<Dictionary<string, string>> GetData(out List<string> columns) {
  2. string line;
  3. string[] stringArray;
  4. char[] charArray = new char[] { ','};
  5. List<Dictionary<string, string>> data = new List<Dictionary<string, string>>();
  6. columns = new List<string>();
  7. try
  8. {
  9. FileStream aFile = new FileStream(@"..\Debug\zhiniao.txt", FileMode.Open);
  10. StreamReader sr = new StreamReader(aFile);
  11. line = sr.ReadLine();
  12. stringArray = line.Split(charArray);
  13. for (int i = ; i <= stringArray.GetUpperBound(); i++)
  14. {
  15. columns.Add(stringArray[i]);
  16. }
  17. line = sr.ReadLine();
  18. while (line!=null)
  19. {
  20. stringArray = line.Split(charArray);
  21. Dictionary<string, string> dataRow = new Dictionary<string, string>();
  22. for (int j = ; j <= stringArray.GetUpperBound(); j++)
  23. {
  24. dataRow.Add(columns[j], stringArray[j]);
  25. }
  26. data.Add(dataRow);
  27. line = sr.ReadLine();
  28. }
  29. sr.Close();
  30. return data;
  31. }
  32. catch (IOException ex)
  33. {
  34. Console.WriteLine(ex.ToString());
  35. Console.WriteLine();
  36. return data;
  37. }
  1. static void Main(string[] args)
  2. {
  3. List<string> columns;
  4. List<Dictionary<string, string>> myData = GetData(out columns);
  5. foreach (string column in columns)
  6. {
  7. Console.Write("{0,-20}", column);
  8. }
  9. Console.WriteLine();
  10. foreach (Dictionary<string,string> row in myData)
  11. {
  12. foreach (string colum in columns)
  13. {
  14. Console.Write("{0,-20}", row[colum]);
  15. }
  16. Console.WriteLine();
  17. }
  18. }

这里有必要对 FileStream 、StreamReader、StreamWriter类做个初步的解析,这里很重要:

FileStream 提供了已字节的方法读取文件流,经常要结合 StreamReader 、StreamWriter使用(Stream操作的是字符)

有时候我们要随机访问文件中间某点的数据,就必须选择 FileStream 对象执行,本例我已经应用到程序中了(注意本例的 line = sr.ReadLine())

一行一行的读取,指针会随着读取的内容指向读取完内容的末尾 接着读取下一行。

1.8读写压缩数据

  1. static void Main(string[] args)
  2. {
  3. try
  4. {
  5. string fileName = "CompressedFile.txt";
  6. Console.WriteLine("请输入要压缩的字符串,最好是英文!");
  7. string sourceString = Console.ReadLine();
  8. StringBuilder sourceStringMultiplier = new StringBuilder(sourceString.Length * );//增长的最大容量
  9. for (int i = ; i < ; i++)
  10. {
  11. sourceStringMultiplier.Append(sourceString);
  12. }
  13. sourceString = sourceStringMultiplier.ToString();
  14. Console.WriteLine("输入数据的字节数 {0}:", sourceString.Length);
  15. SaveCompressedFile(fileName, sourceString);
  16.  
  17. FileInfo compressionFileData = new FileInfo(fileName);
  18. Console.WriteLine("压缩后数据的字节数:{0}", compressionFileData.Length);
  19.  
  20. string reconveredString = LoadCompressionFile(fileName);//读取压缩文件并且转换为字符串
  21. reconveredString = reconveredString.Substring(, reconveredString.Length / );// 从此实例检索子字符串。 子字符串从指定的字符位置开始且具有指定的长度。
  22. Console.WriteLine("还原压缩的字符串数据为: {0}", reconveredString);
  23.  
  24. Console.ReadKey();
  25.  
  26. }
  27. catch (Exception)
  28. {
  29.  
  30. throw;
  31. }
  32.  
  33. }
  34. /// <summary>
  35. /// 压缩
  36. /// </summary>
  37. /// <param name="fileName"></param>
  38. /// <param name="data"></param>
  39. static void SaveCompressedFile(string fileName, string data)
  40. {
  41. FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
  42. GZipStream compressionStream = new GZipStream(fileStream, CompressionMode.Compress);//对两个参数的解析,1.要压缩或解压缩的流. 2.用于指示压缩还是解压缩流的枚举值之一. 将文件流压缩
  43. StreamWriter writer = new StreamWriter(compressionStream);//要写入的流
  44. writer.Write(data);//将压缩流写入data
  45. writer.Close();
  46. }
  47. /// <summary>
  48. /// 解压
  49. /// </summary>
  50. /// <param name="filename"></param>
  51. /// <returns></returns>
  52. static string LoadCompressionFile(string filename)
  53. {
  54. FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
  55. GZipStream compressionStream = new GZipStream(fileStream, CompressionMode.Decompress);
  56. StreamReader reader = new StreamReader(compressionStream);//要读取的流
  57. string data = reader.ReadToEnd();//读取文件压缩字节
  58. reader.Close();
  59. return data;
  60. }

 

1.9 替换字符串

   替换成  

C#字符串分割--一个字符串用另一个字符串来分割成字符串字组

  1. static void SplitStringAndSubstitute()
  2. {
  3. string name = "en_US.txt";
  4. string newname = "en_zhiniao.txt";
  5. string strLine;
  6. StringBuilder sreb = new StringBuilder();
  7. try
  8. {
  9. FileStream aFile = new FileStream(name, FileMode.Open);
  10. StreamReader sr = new StreamReader(aFile);
  11. strLine = sr.ReadLine();
  12.  
  13. string[] strArr;
  14. string str;
  15.  
  16. while (strLine != null)
  17. {
  18.  
  19. strArr = StringSplit(strLine, "] =");//strArr[0].Split('[')[1] 汉字部分 strLine是需要截取额字符串, ] = 是截取字符串的匹配字符串
  20.  
  21. str =strArr[]+"] = "+ strArr[].Split('[')[] + ";";
  22. sreb.AppendLine(str);
  23. strLine = sr.ReadLine();
  24. }
  25. aFile.Close();
  26. sr.Close();
  27. using (StreamWriter sw = new StreamWriter(newname))
  28. {
  29. sw.Write(sreb);
  30. }
  31. }
  32. catch (Exception)
  33. {
  34.  
  35. throw;
  36. }
  37.  
  38. }
    /// <summary>
    /// 将字符串分割成数组
    /// </summary>
    /// <param name="strSource"></param>
    /// <param name="strSplit"></param>
    /// <returns></returns>
  39. static string[] StringSplit(string strSource, string strSplit)
  40. {
  41. string[] strtmp = new string[];
  42. int index = strSource.IndexOf(strSplit, );
  43. if (index < )
  44. {
  45. strtmp[] = strSource;
  46. return strtmp;
  47. }
  48. else
  49. {
  50. strtmp[] = strSource.Substring(, index);
  51. return StringSplit(strSource.Substring(index + strSplit.Length), strSplit, strtmp);
  52. }
  53. }
    /// <summary>
    /// 采用递归将字符串分割成数组
    /// </summary>
    /// <param name="strSource"></param>
    /// <param name="strSplit"></param>
    /// <param name="attachArray"></param>
    /// <returns></returns>
  54. static string[] StringSplit(string strSource, string strSplit, string[] attachArray)
  55. {
  56. string[] strtmp = new string[attachArray.Length + ];
  57. attachArray.CopyTo(strtmp, );
  58.  
  59. int index = strSource.IndexOf(strSplit, );
  60. if (index < )
  61. {
  62. strtmp[attachArray.Length] = strSource;
  63. return strtmp;
  64. }
  65. else
  66. {
  67. strtmp[attachArray.Length] = strSource.Substring(, index);
  68. return StringSplit(strSource.Substring(index + strSplit.Length), strSplit, strtmp);
  69. }
  70. }
  1.  将简体转换为繁体代码 需要添加 .net引用 (Microsoft.VisualBasic):
  1. System.Globalization.CultureInfo cl = new System.Globalization.CultureInfo("zh-CN", false);
    string abc = Microsoft.VisualBasic.Strings.StrConv(@"需要将简体转换为繁体的字符放这", Microsoft.VisualBasic.VbStrConv.TraditionalChinese, cl.LCID);

下面这个方法书正则实现替换

  1. static void RegexTest()
  2. {
  3. using (StreamReader sr = new StreamReader("en_US.txt", Encoding.GetEncoding("utf-8")))
  4. {
  5. using (StreamWriter sw = new StreamWriter("02.txt"))
  6. {
  7. string result;
  8. while ((result = sr.ReadLine()) != null)
  9. {
  10. string str = result;
  11. string reg = @".+\[\'([.+\u4E00-\u9FFF.+]+)\'\].+\=\'(.+)\'\;";
  12. Match mat = Regex.Match(str,reg);
  13. RegexTest();
  14. if (mat.Success)
  15. {
  16. string i = mat.Groups[].Value;//Unfollow
  17. string j = mat.Groups[].Value;//取消关注
  18. string m = mat.Groups[].Value;//"$language['取消关注'] ='Unfollow';"
  19. string newLine = str.Replace(mat.Groups[].Value, mat.Groups[].Value);
  20. sw.WriteLine(newLine);
  21. }
  22. }
  23. }
  24.  
  25. }
  26. Console.WriteLine("成功写入!");
  27. Console.ReadKey();
  28. }

2.0将EXCEL文件转化成CSV(逗号分隔)的文件,用文件流读取(等价就是读取一个txt文本文件)

  1. 先引用命名空间:using System.Text;和using System.IO;
  2. FileStream fs = new FileStream("d:\\Customer.csv", FileMode.Open, FileAccess.Read, FileShare.None);
  3. StreamReader sr = new StreamReader(fs, System.Text.Encoding.GetEncoding());
  4.  
  5. string str = "";
  6. string s = Console.ReadLine();
  7. while (str != null)
  8. { str = sr.ReadLine();
  9. string[] xu = new String[];
  10. xu = str.Split(',');
  11. string ser = xu[];
  12. string dse = xu[]; if (ser == s)
  13. { Console.WriteLine(dse);break;
  14. }
  15. } sr.Close();

另外也可以将数据库数据导入到一个txt文件,实例如下:

  1. //txt文件名
  2. string fn = DateTime.Now.ToString("yyyyMMddHHmmss") + "-" + "PO014" + ".txt";
  3.  
  4. OleDbConnection con = new OleDbConnection(conStr);
  5. con.Open();
  6. string sql = "select ITEM,REQD_DATE,QTY,PUR_FLG,PO_NUM from TSD_PO014";
  7. //OleDbCommand mycom = new OleDbCommand("select * from TSD_PO014", mycon);
  8. //OleDbDataReader myreader = mycom.ExecuteReader(); //也可以用Reader读取数据
  9. DataSet ds = new DataSet();
  10. OleDbDataAdapter oda = new OleDbDataAdapter(sql, con);
  11. oda.Fill(ds, "PO014");
  12. DataTable dt = ds.Tables[];
  13.  
  14. FileStream fs = new FileStream(Server.MapPath("download/" + fn), FileMode.Create, FileAccess.ReadWrite);
  15. StreamWriter strmWriter = new StreamWriter(fs); //存入到文本文件中
  16.  
  17. //把标题写入.txt文件中
  18. //for (int i = 0; i <dt.Columns.Count;i++)
  19. //{
  20. // strmWriter.Write(dt.Columns[i].ColumnName + " ");
  21. //}
  22.  
  23. foreach (DataRow dr in dt.Rows)
  24. {
  25. string str0, str1, str2, str3;
  26. string str = "|"; //数据用"|"分隔开
  27. str0 = dr[].ToString();
  28. str1 = dr[].ToString();
  29. str2 = dr[].ToString();
  30. str3 = dr[].ToString();
  31. str4 = dr[].ToString().Trim();
  32. strmWriter.Write(str0);
  33. strmWriter.Write(str);
  34. strmWriter.Write(str1);
  35. strmWriter.Write(str);
  36. strmWriter.Write(str2);
  37. strmWriter.Write(str);
  38. strmWriter.Write(str3);
  39. strmWriter.WriteLine(); //换行
  40. }
  41. strmWriter.Flush();
  42. strmWriter.Close();
  43. if (con.State == ConnectionState.Open)
  44. {
  45. con.Close();
  46. }

来源: C# 读取EXCEL文件的三种经典方法

代码收集源于书本 :C#程序设计经典300例 、C# 入门经典(第五版),一些自我的理解、学习中写的程序

今天就统计到这里,会持续跟进!

.NET C#操作文件系统数据的常用方法总结 part1的更多相关文章

  1. Node.js之操作文件系统(一)

    Node.js之操作文件系统(一) 1. 同步方法与异步方法 在Node.js中,使用fs模块来实现所有有关文件及目录的创建.写入及删除操作.,在fs模块中,所有对文件及目录的操作都可以使用同步与异步 ...

  2. Node.js之操作文件系统(二)

    Node.js之操作文件系统(二) 1.创建与读取目录 1.1 创建目录 在fs模块中,可以使用mkdir方法创建目录,该方法的使用方法如下: fs.mkdir(path,[mode],callbca ...

  3. 在Node.js中操作文件系统(一)

    在Node.js中操作文件系统 在Node.js中,使用fs模块来实现所有有关文件及目录的创建,写入及删除操作.在fs模块中,所有对文件及目录的操作都可以使用同步与异步这两种方法.比如在执行读文件操作 ...

  4. [转] 查看HDFS文件系统数据的三种方法

    1.使用插件——Hadoop-Eclipse-Plugin此方法需要借助Eclipse,插件的安装及使用请参考博文使用Eclipse编译运行MapReduce程序_Hadoop2.6.0_Ubuntu ...

  5. tensorflow学习笔记——使用TensorFlow操作MNIST数据(2)

    tensorflow学习笔记——使用TensorFlow操作MNIST数据(1) 一:神经网络知识点整理 1.1,多层:使用多层权重,例如多层全连接方式 以下定义了三个隐藏层的全连接方式的神经网络样例 ...

  6. node基础学习——操作文件系统fs

    操作文件系统fs 1.在Node.js中,使用fs模块来实现所有有关文件及目录的创建.写入及删除.在fs模块中,所有对文件及目录的操作都可以使用同步与异步两种方法,具有Sync后缀的方法均为同步方法. ...

  7. 在spark中操作mysql数据 ---- spark学习之七

    使用spark的 DataFrame 来操作mysql数据. DataFrame是比RDD更高一个级别的抽象,可以应用SQL语句进行操作,详细参考: https://spark.apache.org/ ...

  8. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  9. js中如何操作json数据

    一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...

随机推荐

  1. selenium 学习笔记 ---新手学习记录(1) 问题总结

    说明:每次学习各种语言时,环境搭建访问国外网址最头疼了,现在只要是工具下载好放到自己网盘,可以随时用. 1.首先工具准备,selenium需要用到的 下载地址 访问密码 ff8f 2.我选择的语言时j ...

  2. socket 通信 入门3 android 客户端 C# 服务端

    这是一个android端操控服务器的例子  就是发送简单指令到服务器  然后服务器响应什么的... 当然这里是未完成的  只是简单展示一下大致思路 首先连接建立起来后  服务端给客户端一条信息  告诉 ...

  3. ThinkPHP 3.1.2 模板中的基本语法<1>

    # # ThinkPHP 3.1.2 模板中的基本语法 一.传统的方式,导入CSS和JS文件 1.css link js scr <link rel='stylesheet' type='tex ...

  4. 【示例代码】HTML+JS 画图板源码分享

    一个有趣的画图板, 用了 HTML5中的本地存储.下载.canvas 等技术,这个项目中用到了canvas 的很多基础功能,初学者可以学习一下 . 建议开发童鞋使用统一开发环境UDE来进行查看.调试. ...

  5. Swift:使用系统AVFoundation实现二维码扫描和生成

    系统提供的AVCaptureSession仅仅适用于iOS7.0以上的系统.之前的请用Zbar来替代 下载地址:http://download.csdn.net/detail/huobanbengku ...

  6. Oracle表解锁

    网搜 --第一步 查看被锁表 select b.owner,b.object_name, b.object_id,l.session_id,l.locked_mode from v$locked_ob ...

  7. HDU 4548(美素数)

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description 小明对数的 ...

  8. URAL DP第一发

    列表: URAL 1225 Flags URAL 1009 K-based Numbers URAL 1119 Metro URAL 1146 Maximum Sum URAL 1203 Scient ...

  9. 「OC」构造方法和分类

    一.构造方法 (一)构造方法的调用 创建一个可用的对象:Person *p=[Person new]; new方法实际上是分为两步来创建一个对象: 1)使用+alloc方法来分配存储空间(返回分配的对 ...

  10. BZOJ 1194: [HNOI2006]潘多拉的盒子( BFS + tarjan + dp )

    O(S²)枚举2个诅咒机, 然后O(n²)BFS去判断. 构成一个有向图, tarjan缩点, 然后就是求DAG的最长路.. ------------------------------------- ...