c#文件的I/O基本操作

文件是一些永久存储及具有特定顺序的字节组成的一个有序的,具有名称的集合。与文件有关的概念是目录路径和磁盘存储等。流提供了一种向后备存储写入字节和从后备存储读取字节的方式。后备存储包裹用文件存储或用内存(数组)存储,以及网络,CD等。

基本文件的I/O

命名空间为System.I/O,程序集为mscorlib(在mscorlib.dll中)
抽象基类Stream支持读取和写入字节。Stream集成了异步支持,其默认实现根据其相应的异步方法来定义同步读取和写入。
所有表示流的类都是从Stream类继承的。Stream类及其派生类提供数据源和存储库的一般视图,使程序员不必了解操作系统和基础设备的具体细节。
流涉及3个基本操作:从流读取,向流写入以及查找和修改流内当前位置。根据基础数据源或存储库,流可能只支持这些功能中的一部分。例如,NetworkStream不支持查找。Stream的CanRead,CanWrite和CanSeek属性及其派生类决定不同的流所支持的操作。

Stream类

stream是所有流的抽象基类。流是字节序列的抽象概念,如文件,输入输出设备,内部进程通信管道或TCP/IP套接字。Stream类及其派生类提供这些不同类型的输入输出的一般视图,使程序员不必了解操作系统和基础设备的具体细节。
如果用MemoryStream初始化流,流的后备存储是内存,容量随数据动态的增加。如果用FileStream初始化流,流的后备存储是文件,对流的操作视同对文件的操作。

下面的例子使用Stream..WriteByte和Stream..Read写入和读取数据块


代码如下:

using System;
using System.IO;
public class Block
{
public static void main()
{
Stream s=new MemoryStream();//产生一个流,它的后备存储是内存
//将一个字节写入流内的当前位置,位置推进一个字节
for(int i=0;i<100;i++)
{
s.WtriteByte((byte)i);
}
s.Positon=0;//流中位置设置为0
byte[]betes=new byte[1000];
//请求从流中读取的最大字节数等于流的长度
int numBytesToRead=(int)s.Length;
int numBytesRead=0;//偏移量设置为0
while(numBytesToRead>0)
{
//s.Read从当前流读取字节序列,并将此流中的位置提升读取的字节数
//返回值n是实际读取的字节数,如果已到达流的末尾则为零(0)
int n=s.Read(   bytes, //数组bytes接收从流中读取的字节
numBytesRead,   //数组bytes的偏移量,从偏移量开始存储数据
numBytesToRead);//请求读取的最大字节数
if(n==0)
{
break;
}
numBytesRead+=n;
numBytesToRead-=n;
}
s.Close();
//现在请求读取的字节数numBytesToRead为0,偏移量numBytesRead应该为100
Console.WriteLine("number of bytes read:"+numBytesRead);
}
}

输出如下:


代码如下:

number of bytes read:100

File类
file类提供用于创建,复制,删除,移动和打开文件的静态方法,并协助创建FileStream对象。也可将File类用于获取和设置文件属性或有关文件创建,访问及写入操作的DateTime信息。由于所有的File方法都是静态的,因此如果只想执行一个操作,则使用File方法的效果比使用相应的FileInfo实例方法可能更高

下面演示File类的一些主要成员。代码中使用Using语句定义一个范围。将下面的代码放入Main方法。


代码如下:

string path=@"..\...\MyTest.txt";//MyTest.txt位于项目的文件夹
if(!File.Exits(path))
{
//using语句用于定义一个范围,再次范围的末尾将释放对象sw
//StreamWriter实现一个TextWriter,使其以特定的编码UTF-8向流中写入字符
//File.CreateText创建或打开一个文件用于写入UTF-8编码的文本
using(StreamWriter sw=FIle.CreateText(path))
{
sw.WriteLine("Hello");
sw.WriteLine("AND");
sw.WriteLine("Welcome");
}
}
//使用StreamReader读取标准文本文件的各行信息
using (StreamReader sr=File.OpenText(path))
{
string s="";
//从当前的流中读出一行字符将数据作为字符串返回
while((s=sr.ReadLine())!=null)
{
//显示Mytext.txt的内容“Hello/And/Welcome”到屏幕
Console.WriteLine(s);
}
}
try
{
string path2=path+"temp";
File.Delete(path2);//确保目标文件不存在
File.Copy(path,path2);//复制文件
Console.WriteLine("{0}was copied to {1}",path,path2);
File.Delete(path2);
Console.WriteLine("{0}was successfully deleted.",path2);
}
catch(Exception e)
{
Console.WriteLine("The process failed:{0}",e.ToString());
}

运行结果为程序在本项目文件夹建立一个文本文件MyText.txt,屏幕显示为:


代码如下:

Hello/And/Welcome
..\..\myTest.txt was copied to..\..\myTest.txttemp
..\..\myTest.txt was successfully deleted

FileInfo类

FileInfo类提供创建,复制,删除,移动和打开文件的实例方法,并且帮助创建FileStream对象,如果打算多次重用某个对象,可考虑使用FileInfo的实例方法,而不是File类的相对静态方法,以内并不总是需要安全检查
下面的例子是使用FileInfo构造函数创建两个文件,并接着对其进行写入,读取,复制和删除操作


代码如下:

string path=@"..\..\MyText.txt"
FileInfo fil=new FileInfo(path);//FileInfo提供的方法是非静态方法,必须实例化
if(!fil.Exists)
{
using(StreamWriter sw=fil.CreaterText())
{
sw.WriteLine("Hello");
sw.WriteLine("And");
sw.WriteLine("Welcome");
}
}
using(StreamReader sr=fil.OpenText())
{
string s="";
while((s=sr.ReadLine())!=null)
Console.WriteLine(s);
}
try
{
string path2=path+"temp";
FileInfo fi2=new FileInfo(path2);
fi2.Delete();//确保目标文件不存在
fi1.CopyTo(path2);//复制文件
Console.WriteLine("{0}was copied to {1}",path,path2);
fi2.Delete();
Console.WriteLine("{0}was successfully deleted",path2);
}
catch(Exception e)
{
Console.WriteLine("The process failed:{0}",e.Tostring());
}

运行结果为


代码如下:

Hello/And/Welcome
..\..\myTest.txt was copied to..\..\myTest.txttemp
..\..\myTest.txt was successfully deleted

下面的一个例子是显示FileInfo的一些主要成员


代码如下:

//创建磁盘上给你唯一命名的零字节的临时文件并返回该文件的完整路径
//此方法创建带.TMP文件拓展名的临时文件
string path=Path.GetTempFileName();
//初始化FileInfo类的新实例,它作为文件路径的包装
FileInfo fil=new FileInfo(path);
if(!fil.Exists)
{
//fil.CreateText创建吸入新文本文件的StreamWriter
//默认情况下,将向所有用户授予对于新文件的完全读写访问权限
using(StreamWriter sw=fil.CreateText())
{
sw.WriteLine("Hello");
sw.WriteLine("And");
sw.WriteLine("Welcome");
}
}
using(StreamReader sr=fil.OpenText())//打开文件读取
{
string s="";
while((s=sr.ReadLine())!=null)
Console.WriteLine(s);
}
try
{
string path2=Path.GetTempFileName();
FileInfo fi2=new FileInfo(path2);
fi2.Delete();
fi1.CopyTo(path2);
Console.WriteLine("{0}was copied to{1}",path,path2);
fi2.Delete();
Console.WriteLine("{0}was successfully deleted.",path2)
}
catch(Exception e)
{
Console.WriteLine("The process failed:{0}",e.ToString());
}

运行结果如下:


代码如下:

C:\Documents and Settings\Administrator\Local Settings\temp\Temp10.tmp was copied to
C:\Documents and Settings\Administrator\Local Settings\temp\Temp11.tmp
C:\Documents and Settings\Administrator\Local Settings\temp\Temp11.tmp was successfully deleted

(0)

相关推荐

  • C#多线程学习之(四)使用线程池进行多线程的自动管理

    本文实例讲述了C#多线程学习之使用线程池进行多线程的自动管理.分享给大家供大家参考.具体如下: 在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPool(线程池)来解决: 另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒 这一般使用Timer(定时器)来解决: ThreadPool类提供一个由系统维护的线程池(可以看作一个线程的容器),该容器需要 Windows 2000 以上系

  • C#实现线程池的简单示例

    本文以实例演示了C#线程池的简单实现方法.程序中定义了一个对象类,用以包装参数,实现多个参数的传递.成员属性包括两个输入参数和一个输出参数.代码简单易懂,备有注释便于理解. 具体实现代码如下: using System; using System.Threading; //定义对象类,用以包装参数,实现多个参数的传递 class Packet { //成员属性包括两个输入参数和一个输出参数 protected internal String inval1; protected internal

  • C#线程处理系列之线程池中的I/O线程

    一.I/O线程实现对文件的异步  1.1  I/O线程介绍: 对于线程所执行的任务来说,可以把线程分为两种类型:工作者线程和I/O线程. 工作者线程用来完成一些计算的任务,在任务执行的过程中,需要CPU不间断地处理,所以,在工作者线程的执行过程中,CPU和线程的资源是充分利用的. I/O线程主要用来完成输入和输出的工作的,在这种情况下, 计算机需要I/O设备完成输入和输出的任务,在处理过程中,CPU是不需要参与处理过程的,此时正在运行的线程将处于等待状态,只有等任务完成后才会有事可做, 这样就造

  • 解析C#多线程编程中异步多线程的实现及线程池的使用

    0.线程的本质 线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度. 1.多线程: 使用多个处理句柄同时对多个任务进行控制处理的一种技术.据博主的理解,多线程就是该应用的主线程任命其他多个线程去协助它完成需要的功能,并且主线程和协助线程是完全独立进行的.不知道这样说好不好理解,后面慢慢在使用中会有更加详细的讲解. 2.多线程的使用: (1)最简单.最原始的使用方法:Thread oGetArgThre

  • C#线程池用法详细介绍

    介绍 .NET Framework提供了包含ThreadPool类的System.Threading 空间,这是一个可直接访问的静态类,该类对线程池是必不可少的.它是公共"线程池"设计样式的实现.对于后台运行许多各不相同的任务是有用的.对于单个的后台线种而言有更好的选项. 线程的最大数量.这是完全无须知道的.在.NET中ThreadPool的所有要点是它自己在内部管理线程池中线程.多核机器将比以往的机器有更多的线程.微软如此陈述"线程池通常有一个线程的最大数量,如果所有的线程

  • C#线程池操作方法

    本文实例讲述了C#线程池操作方法.分享给大家供大家参考.具体如下: static void Main(string[] args) { //设置线程池中的线程数最大为1000, //第一个为工作者线程,第二个为I/O线程 ThreadPool.SetMaxThreads(1000, 1000); for (int i = 0; i < 10;i ) { ThreadPool.QueueUserWorkItem(new WaitCallback(ShowMessage), string.Forma

  • c#文件的I/O基本操作

    文件是一些永久存储及具有特定顺序的字节组成的一个有序的,具有名称的集合.与文件有关的概念是目录路径和磁盘存储等.流提供了一种向后备存储写入字节和从后备存储读取字节的方式.后备存储包裹用文件存储或用内存(数组)存储,以及网络,CD等. 基本文件的I/O 命名空间为System.I/O,程序集为mscorlib(在mscorlib.dll中)抽象基类Stream支持读取和写入字节.Stream集成了异步支持,其默认实现根据其相应的异步方法来定义同步读取和写入.所有表示流的类都是从Stream类继承的

  • python3大文件解压和基本操作

    先说下:所谓的大文件并不是压缩文件有多大,几十兆的文件而是解压后几百兆.其中就遇到解压不成功的情况..读小文件时成功,大文件时失败等 def unzip_to_txt_plus(zipfilename): zfile = zipfile.ZipFile(zipfilename, 'r') for filename in zfile.namelist(): data = zfile.read(filename) # data = data.decode('gbk').encode('utf-8')

  • centos中文件与权限的基本操作教程

    前言 在开始之前,我们应该简单的了解文件的属性,和如何更改文件属性: 通过我们上面的图片我们可以看出来文件的一些基本属性,有权限,链接数,所有者和所属组,文件大小,修改时间,文件名等 切换目录 cd:切换目录. 当我们需要进入到别的目录的时候,就需要使用到cd这个命令. ' cd这个命令主要有以下几种使用方式; cd [~]:进入当前用户的家目录,比如我是fuwh这个用户登陆的,则进入到/home/fuwh目录 cd 目录名:进入到指定的目录 cd .:就代表当前目录 cd ..:代表进入上一层

  • servlet+JSP+mysql实现文件上传的方法

    本文实例讲述了servlet+JSP+mysql实现文件上传的方法.分享给大家供大家参考,具体如下: 一.文件上传的基本操作: 1. 表单属性enctype的设置 multipart/form-data和application/x-www-form-urlencoded的区别 FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是"application/x-www-form-urlencoded". 然而,在向服务器发送大量的文本.包含非ASCI

  • C语言关于文件的操作方法总结

    目录 什么是文件 程序文件 数据文件 文件名 为什么要使用文件 文件的操作 文件缓冲区 文件指针(FILE) 文件的打开和关闭 fopen fclose 文件的打开方式 流的相关概念 文件的顺序读写 fputc fgets 什么是文件 程序文件 其实从文件的功能的角度来说:我们的文件可以分为两种类型的文件:程序文件和数据文件. 就拿我们C语言的程序为例子,包括了程序文件,即后缀为.c的文件:目标文件,即在windows环境下后缀为.obj的文件:可执行程序文件,即后缀为.exe的文件. 数据文件

  • php目录操作实例代码

    复制代码 代码如下: <?php     /**    * listdir    */    header("content-type:text/html;charset=utf-8"); $dirname = "./final/factapplication"; function listdir($dirname) {        $ds = opendir($dirname);        while (false !== ($file = readd

  • 关于c++ 智能指针及 循环引用的问题

    c++智能指针介绍 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露.如此c++引入 智能指针 ,智能指针即是C++ RAII的一种应用,可用于动态资源管理,资源即对象的管理策略. 智能指针在 <memory>标头文件的 std 命名空间中定义. 它们对 RAII 或 获取资源即初始化 编程惯用法至关重要. RAII 的主要原则是

  • Yii2组件之多图上传插件FileInput的详细使用教程

    在前面给大家写个有关文件上传的文章,包括最基本的yii2文件上传.异步上传到又拍云以及百度编辑器图片上传的问题,貌似不说点多图上传的就不完美. 今天介绍一款多图上传的插件 FileInput,至于为什么选中了TA作为我们上传的插件,一来这货跟Yii2有一腿,用起来方便:二来嘛,用这个插件不仅添加的时候好操作,修改的时候也可以直接通过异步的方式将图片悄无声息的删掉:最值得一提的是,界面效果融合了bootstrap,清爽简洁美观,看起来舒服. 说重点,看具体步骤 首先还是先安装组件 复制代码 代码如

  • Python基础之hashlib模块subprocess模块logging模块

    目录 一.hashlib模块 基本操作与用法 二.subprocess模块简介 基本操作与用法 三.logging模块简介 基本操作与用法 一.hashlib模块 什么是哈希模块: hashlib模块是一种加密模块,内部存有多种加密类型 加密的作用: 可将明文数据进行加密,转换成一串密文,密文越长说明文件加密的越复杂 加密算法的种类: md5 base64 hmac sha系列(sha1.sha224.sha256等等) 补充说明: 1.算法不变,如果内容相同,那么加密的结果肯定相同 2.待加密

  • Python文件与文件夹常见基本操作总结

    本文实例讲述了Python文件与文件夹常见基本操作.分享给大家供大家参考,具体如下: 1.判断文件(夹)是否存在. os.path.exists(pathname) 2.判断路径名是否为文件. os.path.isfile(pathname) 3.判断路径名是否为目录. os.path.isdir(pathname) 4.创建文件. os.mknod(filename) #windows下不可用 open(filename, "w") #记得要关闭 5.复制文件. shutil.cop

随机推荐