.NET C#操作文件系统数据的常用方法总结 part1
目录导航
2.0将EXCEL文件转化成CSV(逗号分隔)的文件,用文件流读取(等价就是读取一个txt文本文件)
1.0开启文件隐藏属性
- string fileName = "text.txt";
- if (!File.Exists(fileName))//判断文件是否存在
- {
- File.Create(fileName);//创建一个文本文件
- }
- //判断文件夹是否已经具有隐藏属性
- if ((File.GetAttributes(fileName)&FileAttributes.Hidden)!=FileAttributes.Hidden)
- {
- File.SetAttributes(fileName, FileAttributes.Hidden);//将文本文件隐藏属性开启
- }
1.1开启文件夹只读属性
- string directoryName = "test";
- if (!Directory.Exists(directoryName))//判断文件夹是否存在
- {
- Directory.CreateDirectory(directoryName);//创建文件夹
- }
- //获取文件夹访问控制列表
- DirectorySecurity dirSecurity = Directory.GetAccessControl(directoryName);
- //将指定访问控制列表添加到当前文件夹
- dirSecurity.AddAccessRule(new FileSystemAccessRule("Admin", FileSystemRights.Read, InheritanceFlags.None, PropagationFlags.InheritOnly, AccessControlType.Allow));//这里的 Admin 字符串是 系统的用户名,否则会报错
- Directory.SetAccessControl(directoryName, dirSecurity);//设置文件夹访问控制列表
1.0与1.1 比较
不同之处: 一个是文件一个是文件夹,所以在判断文件和文件夹是否存在的时候 用的类不同 ,分别是File 和 Directory
下面对这两个类给个初步说明
File :提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 System.IO.FileStream 对象。
Directory:公开用于创建、移动和枚举通过目录和子目录的静态方法。 此类不能被继承。
处理文件会经常使用这2个类
1.2 输出子文件夹路径
- static void Main(string[] args)
- {
- string path = @"D:\study\2015年\文件系统\01\01";
- DisplayDirectories(path);
- }
- static void DisplayDirectories(string path)
- {
- DirectoryInfo directoryInfo = new DirectoryInfo(path);
- Console.WriteLine(directoryInfo.FullName);//输出文件夹信息
- foreach (DirectoryInfo DI in directoryInfo.GetDirectories())
- {
- DisplayDirectories(DI.FullName);//输出子文件夹信息
- }
- }
这里介绍下 DirectoryInfo 类 :公开用于创建、移动和枚举目录和子目录的实例方法。 此类不能被继承。
1.3统计文件数目
- static void Main(string[] args)
- {
- string path = @"D:\study\2015年\文件系统\01\01";
- Console.WriteLine("路径{0}下的文件数目为{1}", path, GetFileCount(path));
- }
- static int GetFileCount(string path)
- {
- int count = ; //文件数目
- DirectoryInfo directoryInfo = new DirectoryInfo(path);//路径信息
- count += directoryInfo.GetFiles().Length;
- foreach (var item in directoryInfo.GetDirectories())//获取路劲下的子目录
- {
- count += GetFileCount(item.FullName);//获取子目录中的文件数目
- }
- return count;
- }
1.4批量重命名文件
- //先创建文件
- Random random = new Random();
- string path = Directory.GetCurrentDirectory();//获取当前路径创建10个随机命名的文件
- for (int i = ; i < ; i++)
- {
- File.CreateText(path + "\\" + random.Next(int.MaxValue) + ".txt").Close();
- }
- DirectoryInfo directoryInfo = new DirectoryInfo(path);//创建当前目录信息类实例
- Console.WriteLine("当前目录下的文本文件有:");
- foreach (FileInfo file in directoryInfo.GetFiles("*.txt"))
- {
- Console.WriteLine(file.Name);
- }
- //对文件重命名
- Console.WriteLine("对当前目录下的文本文件重命名:");
- foreach (FileInfo file in directoryInfo.GetFiles("*.txt"))
- {
- string newName = random.Next(int.MaxValue).ToString();
- Console.WriteLine("将{0}重命名为{1}", file.Name, newName + ".txt");
- File.Move(file.Name, newName + ".txt");
- }
1.5分割文件
- //创建文本文件
- string fileName = Directory.GetCurrentDirectory() + "\\zhiniao.txt";
- StreamWriter writer = File.CreateText(fileName);//创建文本文件写入流类实例
- for (int i = ; i < ; i++)
- {
- writer.Write("zhiniao ");//**这里有个小异常没有解决,望有心人看见给予帮助?
- }
- writer.Close();
- //以文件流的形式打开 zhiniao.txt, 将其按指定大小分割
- FileStream fileStream = new FileStream(fileName, FileMode.Open);//创建文件流类型
- Console.WriteLine("文件{0}的长度为{1}字节", fileStream.Name, fileStream.Length);
- Console.WriteLine("请输入需要分割文件的长度:");
- int subLength = int.Parse(Console.ReadLine());//分割后子文件的长度
- byte[] buffer = new byte[subLength];
- Console.WriteLine("分割后的文件的路径:");
- int subCount = (int)(fileStream.Length + subLength - ) / subLength;//分割后子文件的数量
- for (int i = ; i < subCount; i++)
- {
- int readLength = fileStream.Read(buffer, , subLength);//读取的字节数
- string subName = fileStream.Name + "." + i + ".txt";
- FileStream subFile = File.Create(subName);//创建子文件
- subFile.Write(buffer, , readLength);//写入子文件
- subFile.Close();
- Console.WriteLine("文件{0}\t的长度{1}字节",subName,readLength);
- }
- fileStream.Close();
这里有个小异常没有解决,望有心人看见给予帮助? 异常消息:system.invalidoperationexception 此流上不支持超时
1.6拼接文件
- //创建文本文件
- string fileName = Directory.GetCurrentDirectory() + "\\zhiniao.txt";
- FileStream file = File.Create(fileName);//创建主文件
- int subIndex = ;//子文件索引
- while (File.Exists(file.Name + "." + subIndex + ".txt"))
- {
- //打开子文件流
- FileStream subFile = new FileStream(file.Name + "." + subIndex + ".txt", FileMode.Open);
- byte[] buffer = new byte[subFile.Length];//子文件缓存
- int readLength = subFile.Read(buffer, , buffer.Length);//读取子文件
- file.Write(buffer, , readLength);
- subFile.Close();
- subIndex++;
- }
- file.Close();
- StreamReader reader = new StreamReader(fileName);
- Console.WriteLine(reader.ReadToEnd());
- reader.Close();
1.7读取用逗号分割的值
读取前 读取后
- static List<Dictionary<string, string>> GetData(out List<string> columns) {
- string line;
- string[] stringArray;
- char[] charArray = new char[] { ','};
- List<Dictionary<string, string>> data = new List<Dictionary<string, string>>();
- columns = new List<string>();
- try
- {
- FileStream aFile = new FileStream(@"..\Debug\zhiniao.txt", FileMode.Open);
- StreamReader sr = new StreamReader(aFile);
- line = sr.ReadLine();
- stringArray = line.Split(charArray);
- for (int i = ; i <= stringArray.GetUpperBound(); i++)
- {
- columns.Add(stringArray[i]);
- }
- line = sr.ReadLine();
- while (line!=null)
- {
- stringArray = line.Split(charArray);
- Dictionary<string, string> dataRow = new Dictionary<string, string>();
- for (int j = ; j <= stringArray.GetUpperBound(); j++)
- {
- dataRow.Add(columns[j], stringArray[j]);
- }
- data.Add(dataRow);
- line = sr.ReadLine();
- }
- sr.Close();
- return data;
- }
- catch (IOException ex)
- {
- Console.WriteLine(ex.ToString());
- Console.WriteLine();
- return data;
- }
- static void Main(string[] args)
- {
- List<string> columns;
- List<Dictionary<string, string>> myData = GetData(out columns);
- foreach (string column in columns)
- {
- Console.Write("{0,-20}", column);
- }
- Console.WriteLine();
- foreach (Dictionary<string,string> row in myData)
- {
- foreach (string colum in columns)
- {
- Console.Write("{0,-20}", row[colum]);
- }
- Console.WriteLine();
- }
- }
这里有必要对 FileStream 、StreamReader、StreamWriter类做个初步的解析,这里很重要:
FileStream 提供了已字节的方法读取文件流,经常要结合 StreamReader 、StreamWriter使用(Stream操作的是字符)
有时候我们要随机访问文件中间某点的数据,就必须选择 FileStream 对象执行,本例我已经应用到程序中了(注意本例的 line = sr.ReadLine())
一行一行的读取,指针会随着读取的内容指向读取完内容的末尾 接着读取下一行。
1.8读写压缩数据
- static void Main(string[] args)
- {
- try
- {
- string fileName = "CompressedFile.txt";
- Console.WriteLine("请输入要压缩的字符串,最好是英文!");
- string sourceString = Console.ReadLine();
- StringBuilder sourceStringMultiplier = new StringBuilder(sourceString.Length * );//增长的最大容量
- for (int i = ; i < ; i++)
- {
- sourceStringMultiplier.Append(sourceString);
- }
- sourceString = sourceStringMultiplier.ToString();
- Console.WriteLine("输入数据的字节数 {0}:", sourceString.Length);
- SaveCompressedFile(fileName, sourceString);
- FileInfo compressionFileData = new FileInfo(fileName);
- Console.WriteLine("压缩后数据的字节数:{0}", compressionFileData.Length);
- string reconveredString = LoadCompressionFile(fileName);//读取压缩文件并且转换为字符串
- reconveredString = reconveredString.Substring(, reconveredString.Length / );// 从此实例检索子字符串。 子字符串从指定的字符位置开始且具有指定的长度。
- Console.WriteLine("还原压缩的字符串数据为: {0}", reconveredString);
- Console.ReadKey();
- }
- catch (Exception)
- {
- throw;
- }
- }
- /// <summary>
- /// 压缩
- /// </summary>
- /// <param name="fileName"></param>
- /// <param name="data"></param>
- static void SaveCompressedFile(string fileName, string data)
- {
- FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
- GZipStream compressionStream = new GZipStream(fileStream, CompressionMode.Compress);//对两个参数的解析,1.要压缩或解压缩的流. 2.用于指示压缩还是解压缩流的枚举值之一. 将文件流压缩
- StreamWriter writer = new StreamWriter(compressionStream);//要写入的流
- writer.Write(data);//将压缩流写入data
- writer.Close();
- }
- /// <summary>
- /// 解压
- /// </summary>
- /// <param name="filename"></param>
- /// <returns></returns>
- static string LoadCompressionFile(string filename)
- {
- FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
- GZipStream compressionStream = new GZipStream(fileStream, CompressionMode.Decompress);
- StreamReader reader = new StreamReader(compressionStream);//要读取的流
- string data = reader.ReadToEnd();//读取文件压缩字节
- reader.Close();
- return data;
- }
1.9 替换字符串
替换成
C#字符串分割--一个字符串用另一个字符串来分割成字符串字组
- static void SplitStringAndSubstitute()
- {
- string name = "en_US.txt";
- string newname = "en_zhiniao.txt";
- string strLine;
- StringBuilder sreb = new StringBuilder();
- try
- {
- FileStream aFile = new FileStream(name, FileMode.Open);
- StreamReader sr = new StreamReader(aFile);
- strLine = sr.ReadLine();
- string[] strArr;
- string str;
- while (strLine != null)
- {
- strArr = StringSplit(strLine, "] =");//strArr[0].Split('[')[1] 汉字部分 strLine是需要截取额字符串, ] = 是截取字符串的匹配字符串
- str =strArr[]+"] = "+ strArr[].Split('[')[] + ";";
- sreb.AppendLine(str);
- strLine = sr.ReadLine();
- }
- aFile.Close();
- sr.Close();
- using (StreamWriter sw = new StreamWriter(newname))
- {
- sw.Write(sreb);
- }
- }
- catch (Exception)
- {
- throw;
- }
- }
/// <summary>
/// 将字符串分割成数组
/// </summary>
/// <param name="strSource"></param>
/// <param name="strSplit"></param>
/// <returns></returns>- static string[] StringSplit(string strSource, string strSplit)
- {
- string[] strtmp = new string[];
- int index = strSource.IndexOf(strSplit, );
- if (index < )
- {
- strtmp[] = strSource;
- return strtmp;
- }
- else
- {
- strtmp[] = strSource.Substring(, index);
- return StringSplit(strSource.Substring(index + strSplit.Length), strSplit, strtmp);
- }
- }
/// <summary>
/// 采用递归将字符串分割成数组
/// </summary>
/// <param name="strSource"></param>
/// <param name="strSplit"></param>
/// <param name="attachArray"></param>
/// <returns></returns>- static string[] StringSplit(string strSource, string strSplit, string[] attachArray)
- {
- string[] strtmp = new string[attachArray.Length + ];
- attachArray.CopyTo(strtmp, );
- int index = strSource.IndexOf(strSplit, );
- if (index < )
- {
- strtmp[attachArray.Length] = strSource;
- return strtmp;
- }
- else
- {
- strtmp[attachArray.Length] = strSource.Substring(, index);
- return StringSplit(strSource.Substring(index + strSplit.Length), strSplit, strtmp);
- }
- }
- 将简体转换为繁体代码 , 需要添加 .net引用 (Microsoft.VisualBasic):
- System.Globalization.CultureInfo cl = new System.Globalization.CultureInfo("zh-CN", false);
string abc = Microsoft.VisualBasic.Strings.StrConv(@"需要将简体转换为繁体的字符放这", Microsoft.VisualBasic.VbStrConv.TraditionalChinese, cl.LCID);
下面这个方法书正则实现替换
- static void RegexTest()
- {
- using (StreamReader sr = new StreamReader("en_US.txt", Encoding.GetEncoding("utf-8")))
- {
- using (StreamWriter sw = new StreamWriter("02.txt"))
- {
- string result;
- while ((result = sr.ReadLine()) != null)
- {
- string str = result;
- string reg = @".+\[\'([.+\u4E00-\u9FFF.+]+)\'\].+\=\'(.+)\'\;";
- Match mat = Regex.Match(str,reg);
- RegexTest();
- if (mat.Success)
- {
- string i = mat.Groups[].Value;//Unfollow
- string j = mat.Groups[].Value;//取消关注
- string m = mat.Groups[].Value;//"$language['取消关注'] ='Unfollow';"
- string newLine = str.Replace(mat.Groups[].Value, mat.Groups[].Value);
- sw.WriteLine(newLine);
- }
- }
- }
- }
- Console.WriteLine("成功写入!");
- Console.ReadKey();
- }
2.0将EXCEL文件转化成CSV(逗号分隔)的文件,用文件流读取(等价就是读取一个txt文本文件)
- 先引用命名空间:using System.Text;和using System.IO;
- FileStream fs = new FileStream("d:\\Customer.csv", FileMode.Open, FileAccess.Read, FileShare.None);
- StreamReader sr = new StreamReader(fs, System.Text.Encoding.GetEncoding());
- string str = "";
- string s = Console.ReadLine();
- while (str != null)
- { str = sr.ReadLine();
- string[] xu = new String[];
- xu = str.Split(',');
- string ser = xu[];
- string dse = xu[]; if (ser == s)
- { Console.WriteLine(dse);break;
- }
- } sr.Close();
另外也可以将数据库数据导入到一个txt文件,实例如下:
- //txt文件名
- string fn = DateTime.Now.ToString("yyyyMMddHHmmss") + "-" + "PO014" + ".txt";
- OleDbConnection con = new OleDbConnection(conStr);
- con.Open();
- string sql = "select ITEM,REQD_DATE,QTY,PUR_FLG,PO_NUM from TSD_PO014";
- //OleDbCommand mycom = new OleDbCommand("select * from TSD_PO014", mycon);
- //OleDbDataReader myreader = mycom.ExecuteReader(); //也可以用Reader读取数据
- DataSet ds = new DataSet();
- OleDbDataAdapter oda = new OleDbDataAdapter(sql, con);
- oda.Fill(ds, "PO014");
- DataTable dt = ds.Tables[];
- FileStream fs = new FileStream(Server.MapPath("download/" + fn), FileMode.Create, FileAccess.ReadWrite);
- StreamWriter strmWriter = new StreamWriter(fs); //存入到文本文件中
- //把标题写入.txt文件中
- //for (int i = 0; i <dt.Columns.Count;i++)
- //{
- // strmWriter.Write(dt.Columns[i].ColumnName + " ");
- //}
- foreach (DataRow dr in dt.Rows)
- {
- string str0, str1, str2, str3;
- string str = "|"; //数据用"|"分隔开
- str0 = dr[].ToString();
- str1 = dr[].ToString();
- str2 = dr[].ToString();
- str3 = dr[].ToString();
- str4 = dr[].ToString().Trim();
- strmWriter.Write(str0);
- strmWriter.Write(str);
- strmWriter.Write(str1);
- strmWriter.Write(str);
- strmWriter.Write(str2);
- strmWriter.Write(str);
- strmWriter.Write(str3);
- strmWriter.WriteLine(); //换行
- }
- strmWriter.Flush();
- strmWriter.Close();
- if (con.State == ConnectionState.Open)
- {
- con.Close();
- }
代码收集源于书本 :C#程序设计经典300例 、C# 入门经典(第五版),一些自我的理解、学习中写的程序
今天就统计到这里,会持续跟进!
.NET C#操作文件系统数据的常用方法总结 part1的更多相关文章
- Node.js之操作文件系统(一)
Node.js之操作文件系统(一) 1. 同步方法与异步方法 在Node.js中,使用fs模块来实现所有有关文件及目录的创建.写入及删除操作.,在fs模块中,所有对文件及目录的操作都可以使用同步与异步 ...
- Node.js之操作文件系统(二)
Node.js之操作文件系统(二) 1.创建与读取目录 1.1 创建目录 在fs模块中,可以使用mkdir方法创建目录,该方法的使用方法如下: fs.mkdir(path,[mode],callbca ...
- 在Node.js中操作文件系统(一)
在Node.js中操作文件系统 在Node.js中,使用fs模块来实现所有有关文件及目录的创建,写入及删除操作.在fs模块中,所有对文件及目录的操作都可以使用同步与异步这两种方法.比如在执行读文件操作 ...
- [转] 查看HDFS文件系统数据的三种方法
1.使用插件——Hadoop-Eclipse-Plugin此方法需要借助Eclipse,插件的安装及使用请参考博文使用Eclipse编译运行MapReduce程序_Hadoop2.6.0_Ubuntu ...
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(2)
tensorflow学习笔记——使用TensorFlow操作MNIST数据(1) 一:神经网络知识点整理 1.1,多层:使用多层权重,例如多层全连接方式 以下定义了三个隐藏层的全连接方式的神经网络样例 ...
- node基础学习——操作文件系统fs
操作文件系统fs 1.在Node.js中,使用fs模块来实现所有有关文件及目录的创建.写入及删除.在fs模块中,所有对文件及目录的操作都可以使用同步与异步两种方法,具有Sync后缀的方法均为同步方法. ...
- 在spark中操作mysql数据 ---- spark学习之七
使用spark的 DataFrame 来操作mysql数据. DataFrame是比RDD更高一个级别的抽象,可以应用SQL语句进行操作,详细参考: https://spark.apache.org/ ...
- C#操作Excel数据增删改查(转)
C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...
- js中如何操作json数据
一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...
随机推荐
- selenium 学习笔记 ---新手学习记录(1) 问题总结
说明:每次学习各种语言时,环境搭建访问国外网址最头疼了,现在只要是工具下载好放到自己网盘,可以随时用. 1.首先工具准备,selenium需要用到的 下载地址 访问密码 ff8f 2.我选择的语言时j ...
- socket 通信 入门3 android 客户端 C# 服务端
这是一个android端操控服务器的例子 就是发送简单指令到服务器 然后服务器响应什么的... 当然这里是未完成的 只是简单展示一下大致思路 首先连接建立起来后 服务端给客户端一条信息 告诉 ...
- ThinkPHP 3.1.2 模板中的基本语法<1>
# # ThinkPHP 3.1.2 模板中的基本语法 一.传统的方式,导入CSS和JS文件 1.css link js scr <link rel='stylesheet' type='tex ...
- 【示例代码】HTML+JS 画图板源码分享
一个有趣的画图板, 用了 HTML5中的本地存储.下载.canvas 等技术,这个项目中用到了canvas 的很多基础功能,初学者可以学习一下 . 建议开发童鞋使用统一开发环境UDE来进行查看.调试. ...
- Swift:使用系统AVFoundation实现二维码扫描和生成
系统提供的AVCaptureSession仅仅适用于iOS7.0以上的系统.之前的请用Zbar来替代 下载地址:http://download.csdn.net/detail/huobanbengku ...
- Oracle表解锁
网搜 --第一步 查看被锁表 select b.owner,b.object_name, b.object_id,l.session_id,l.locked_mode from v$locked_ob ...
- HDU 4548(美素数)
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 小明对数的 ...
- URAL DP第一发
列表: URAL 1225 Flags URAL 1009 K-based Numbers URAL 1119 Metro URAL 1146 Maximum Sum URAL 1203 Scient ...
- 「OC」构造方法和分类
一.构造方法 (一)构造方法的调用 创建一个可用的对象:Person *p=[Person new]; new方法实际上是分为两步来创建一个对象: 1)使用+alloc方法来分配存储空间(返回分配的对 ...
- BZOJ 1194: [HNOI2006]潘多拉的盒子( BFS + tarjan + dp )
O(S²)枚举2个诅咒机, 然后O(n²)BFS去判断. 构成一个有向图, tarjan缩点, 然后就是求DAG的最长路.. ------------------------------------- ...