C# 文件IO

2023-11-14

判断某个文件夹是否存在

Console.WriteLine(Directory.Exists(@"C:\Windows"));

获取当前运行程序(exe或dll)所在路径

Console.WriteLine(Directory.GetCurrentDirectory());
//或
Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);

创建文件夹

DirectoryInfo directoryInfo = Directory.CreateDirectory(@"D:/test1/test2/test3/test4");

移动(剪切)文件夹

Directory.Move(@"D:/sourceDir", @"D:/destDir");

复制文件

File.Copy(@"D:/sourceFile", @"D:/destFile");

创建文件

FileStream fileStream = File.Create("D:/test/file1.txt")

注意File.Create是覆盖的,即如果文件已存在则会被清空
File.Create是独占的,文件创建后关闭前,其它程序不能访问该文件

覆盖写文件

方式一:使用FileStream

using (FileStream fileStream = File.Create("D:/test/file1.txt"))
{
	//将内容写入缓冲区
    fileStream.Write(Encoding.UTF8.GetBytes("hello\r\nhello2"));
    //清空缓冲区,这时缓冲区的内容才会被真正写入文件中,此处的Flush方法可不调用,因为使用了using,当离开using时fileStream关闭,将自动清空缓冲区。反之,如果不使用using则需要手动调用fileStream.Flush()方法或fileStream.Close()方法,否则内容不会被写入文件中
    //fileStream.Flush();
}

方式二:使用StreamWriter

using (StreamWriter streamWriter = new StreamWriter("D:/test/file1.txt"))
{
    streamWriter.WriteLine("hello3");
    streamWriter.WriteLine("hello4");
    //streamWriter.Flush();
}

追加写文件

using (StreamWriter streamWriter = File.AppendText(@"D:\test\file1.txt"))
{
    streamWriter.WriteLine("hello5");
}

读文件

一:一次性读完文件所有内容

1.一次性读完分行保存在string[]中:

foreach(string line in File.ReadAllLines("D:/test/file1.txt"))
{
    Console.WriteLine(line);
}

2.一次性读完所有内容保存在一个string变量中

string fileString = File.ReadAllText("D:/test/file1.txt");
Console.WriteLine(fileString);

3.一次性读完所有内容保存在bite[]中

byte[] fileBytes = File.ReadAllBytes("D:/test/file1.txt");
Console.WriteLine(Encoding.Default.GetString(fileBytes));

一次性读完文件所有内容有个问题,就是当文件特别大时一次性把文件的内容读到内存中显然是不现实的,因此需要有一次性读文件的一部分到内存中的方法

二:读部分

1.一次读取一行

StreamReader streamReader = new("D:/test/file1.txt");
string line = string.Empty;
while (true)
{
    line = streamReader.ReadLine();
    if (line is not null)
    {
        Console.WriteLine(line);
    }
    else
    {
        break;
    }
}

2.一次读取固定长度的byte[]

const int MAXSIZE = 1024;
byte[] buffer = new byte[MAXSIZE];

using (var fileStream = File.OpenRead("D:/test/file1.txt"))
{
    int numOfByte = 0;
    do
    {
        Console.Write(Encoding.Default.GetString(buffer));
        numOfByte = fileStream.Read(buffer, 0, MAXSIZE);
    }
    while (numOfByte == MAXSIZE);
}

以上程序运行时出现乱码,原因是中文UTF8编码后占三个字节
如果按固定长度读取byte[],可能导致中文字符截断,
例如假设byte[]最大长度为100,则只能存放33个中文加上1/3个中文,这样中文字符被截断出现乱码
我目前还没有找到很好的解决该问题的方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 文件IO 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查

随机推荐

  • 应用场域的深度融合与创新构想

    近年来 随着人工智能技术的迅速发展 自然语言处理技术也取得了显著的进步 其中 ChatGPT作为一种高效的自然语言处理模型 已经在许多领域得到了广泛的应用 本文主要围绕ChatGPT的调研分析以及其与应用场域的结合构想展开讨论 一 Chat
  • BigDecimal转String字符串的代码

    BigDecimal转String字符串的代码 Posted on 2016 06 28 11 17 上善其若水 厚德载物 阅读 8896 评论 0 编辑 收藏 举报 bigdeciaml stripTrailingZeros toPlai
  • 求最大子序列和的四种方法

    求一个给定序列的连续子序列中和最大的那个子序列的和 下边方法只求和 没有找出最大子序列 用到的头文件和宏定义如下 include stdafx h include
  • 机器学习:聚类算法实现流程

    学习目标 掌握K means聚类的实现步骤 k means其实包含两层内容 K 初始中心点个数 计划聚类数 means 求中心点到其他数据点距离的平均值 1 k means聚类步骤 1 随机设置K个特征空间内的点作为初始的聚类中心 2 对于
  • 抖音矩阵系统功能开发及开发文档说明

    抖音账号矩阵系统开发文档是矩阵系统开发的重要文件 涵盖了矩阵系统的设计 实现 测试和维护等方面的相关信息 这些信息是矩阵系统开发人员进行系统开发的重要参考 有助于确保系统开发的顺利进行和最终的实现效果 矩阵系统开发文档一般包括以下几个方面的
  • mysql的悲观锁和乐观锁

    悲观锁 悲观锁指的是对数据被外界 包括本系统当前的其他事务 以及来自外部系统的事务处理 修改持保守态度 因此 在整个数据处理过程中 将数据处于锁定状态 悲观锁的实现 往往依靠数据库提供的锁机制 也只有数据库层提供的锁机制才能真正保证数据访问
  • MyBatis框架的作用?

    1 MyBatis 是一个优秀的基于 java 的持久层框架 它内部封装了 jdbc 使开发者只需要关注 sql 语句本身 而不需要花费精力去处理加载驱动 创建连接 创建 statement 等繁杂的过程 2 MyBatis为了和数据库进行
  • C++函数(详细版)

    函数 函数指针 内联函数 decltype关键字 atuo关键字 返回引用 const关键字 二维数组 函数指针 概念 函数也是有地址的 而指向这个地址的指针就是函数指针 1 获取函数的地址 使用函数名即可 例如think 是一个函数 则t
  • Python编程挑战赛

    题1 给小朋友分糖 每人分到糖的数量不同 输入小朋友的数量 计算至少需要多少糖 思路 第1个小朋友1颗糖 第2个小朋友2颗糖 第3个小朋友3颗糖 第n个小朋友n颗糖 计算1 2 n的和即可 第1种写法 不用Python高级函数 n int
  • 安装和简单使用visual studio 2017

    1 安装visual studio installer小程序 VS 2017社区版 Community 下载地址 百度网盘下载链接 百度网盘 请输入提取码 密码 ub6c 2 在visual studio installer里下载安装vis
  • Vue3 自定义指令

    在前端项目中 有很多需求是需要在多页面进行逻辑处理 通常我们所需要的功能可以通过DOM操作来实现 或者多处功能一致 我们就可以使用自定义指令 在vue2中的自定义指令指令注册的方法是 v focus js import vue from v
  • 概率论之 -- 边缘分布

    边缘分布 Marginal Distribution 指在概率论和统计学的多维随机变量中 只包含其中部分变量的概率分布 中文名 边缘分布 外文名 marginal distribution 又 名 边际分布 应用学科 概率论 统计学 定义
  • 还在用夸克?这3款能安装插件的手机浏览器不香吗

    说到浏览器插件 很多人想到的多数是电脑上的玩法 实际上 随着手机浏览器功能越来越完善 很多手机浏览器已经开始支持插件的使用 也就是说 支持安装插件的手机浏览器 不仅能体验如电脑般丝滑强大的功能 而且又不会造成内存过分臃肿 开启响应缓慢的问题
  • GLSL着色器的正确文件扩展名是什么?

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 glslangValidator exe工具使用 二 着色器程序后缀名 前言 我正在学习glsl着色 我遇到了不同的文件格式 我见过人们给出他们的顶点和片段着色器 ve
  • Java中在特定区间产生随机数

    原文地址 http blog sina com cn s blog 59aebaa10100ct47 html 参考地址 http blog csdn net codefunjava article details 44408555 htt
  • 贝叶斯分类器-机器学习ML

    参考 1 统计学习方法 李航 2 https baike baidu com item E8 B4 9D E5 8F B6 E6 96 AF E5 88 86 E7 B1 BB E5 99 A8 1739590 fr aladdin 3 h
  • 力扣|错误的集合 C语言

    题目连接 错误的集合 集合 s 包含从 1 到 n 的整数 不幸的是 因为数据错误 导致集合里面某一个数字复制了成了集合里面的另外一个数字的值 导致集合 丢失了一个数字 并且 有一个数字重复 给定一个数组 nums 代表了集合 S 发生错误
  • 浅析muduo库中的定时器设施

    一个设计良好的定时器在服务端的应用程序上至关重要 muduo定时器的实现陈硕大牛在书中已经详细的谈过 笔者尝试从源码的角度解读定时器的实现 如果理解不对 欢迎指正 在muduo的定时器系统中 一共由四个类 Timestamp Timer T
  • 学习CSSGrid布局

    一 重要术语 CSS Grid 网格 布局 又称为 Grid 网格 是一个二维的基于网格的布局系统 它的目标是完全改变我们基于网格的用户界面的布局方式 FlexBox 一维布局 Grid 二维布局 Flexbox 和 Grid 能协同工作
  • C# 文件IO

    文章目录 判断某个文件夹是否存在 获取当前运行程序 exe或dll 所在路径 创建文件夹 移动 剪切 文件夹 复制文件 创建文件 覆盖写文件 方式一 使用FileStream 方式二 使用StreamWriter 追加写文件 读文件 一 一