.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.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...
随机推荐
- Mysql 库、表、字段 字符集
show character set;show create database aloe;show create table book_category;show full columns from ...
- Springmvc异步上传文件
<script src="js/jquery.js" type="text/javascript"></script><scrip ...
- ftp一些东东
ftp如果绑定域名 登录时登录名应该写成 域名|用户名
- Teclast/台电 P98HD四核测评9.7寸台电P98HD 评测体验 (转载)
自从苹果新iPad上市推出后,拥有Retina高清屏幕分辨率的平板让我们的视线一下子变得“清晰”起来,超高2048x1536分辨率也成为厂商们追捧的对象,在经历了双核时代配备高清分辨率对于硬件性能承载 ...
- 转: sublime text常用插件和快捷键
Sublime Text 2是一个轻量.简洁.高效.跨平台的编辑器.博主之前一直用notepdd++写前端代码,用得也挺顺手了,早就听说sublime的大名,一直也懒得去试试看,认为都是工具用着顺手就 ...
- 针对PCB飞针测试快速有效的技巧
测试探针通过多路传输(multiplexing)系统连接到驱动器(信号发生器.电源供应等)和传感器(数字万用表.频率计数器等)来测试UUT上的元件.当一个元件正在测试的时候,UUT上的其它元件通过探针 ...
- Ubuntu离线安装软件包
一.应用场景 a.当我们需要在多台电脑安装同一个软件,并且这个软件很大,下载需要很长时间时 b.需要安装软件的ubuntu不能上网 二.离线安装包的制作 2.1.通过如下指令下载XXXX软件所需要的d ...
- 基于Visual C++2013拆解世界五百强面试题--题13-找最大公共子字符串
编程实现:找出两个字符串中最大公共子字符串,如"abccade"和"dgcadde"的最大子字符串为"cad". 如果不考虑效率的话直接比较 ...
- :before :after
#p1:before{ content: "哈哈哈 "; color: red;}#p1:after{ content: "哈哈哈"; color: #452d ...
- 引用类型List<T>的比较
一:重新Equals和GetHashCode方法 /// <summary> /// 描 述:弹出模型对象列表比较器(根据ID比较) /// </summary&g ...