C#成魔之路<8>文件及数据流技术(1)

文件操作是操作系统的一个重要组成部分,.NET框架提供了一个System.IO命名空间,其中包含了多种用于对文件、文件夹和数据流进行操作的类,这些类即支持同步操作,也支持异步操作。

1、System.IO命名空间
System.IO命名空间包含允许在数据流和文件上进行同步和异步读取以及写入的类型。这里需要注意文件和流的差异,文件是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合,因此,关于文件,人们常会想到目录路径、磁盘存储、文件和目录名等方面:而流则提供一种向后备存储写入字节和从后备存储读取字节的方式,后备存储可以为多种存储媒介之一,正如除磁盘外存在多种后备存储一样,除文件流之外也存在多种流。
System.IO命名空间当中的类:

BinaryReader:用特定的编码将基元数据类型读作二进制值。
BinaryWriter:以二进制形式将基元类型写入流,并且支持用特定的编码写入字符串。
BufferedStream:给另一流上的读写操作添加一个缓冲层,且无法继承此类。
Directory:公开用于创建、移动和枚举通过目录和子目录的静态方法。无法继承此类。
DirectoryInfo:公开用于创建、移动和枚举目录和子目录的实例方法。无法继承此类。
DriveInfo:提供用于创建、复制、删除、移动和打开文件的静态方法,并且协助创建FileStream对象。
File:提供用于创建、赋值、删除、移动和打开文件的静态方法,并协助创建Filestream对象。
FileInfo:提供用于创建、赋值、删除、移动和打开文件的实例方法,并且帮助创建FileStream对象。
FileStream:公开以文件为主的Stream,即支持同步读写操作,也支持异步读写操作。
FileSystemInfo:为Fileinfo和Directoryinfo对象提供积累。
FileSystemWatcher:帧听文件系统更改通知,并且在目录或者目录中的文件发生更改时引发事件。
IOException:发生IO错误时候常引发的异常。
MemoryStream:创建其支持存储区为内存的流。
Path:对包含文件或者目录路径信息的string实例执行操作。这些操作是以跨平台的方式执行的。
Stream:提供字节序列的一般视图。
StreamReader:实现一个TextReader,使其能够用一种特定的编码从字节流中读取字符。
StreamWriter:实现一个TextWriter,使其能够用一种特定的编码从字节流中写入字符。
StringReader:实现从字符串进行读取的TextReader。
StringWriter:实现一个用于将信息写入字符串的TextWriter。该信息存储在基础StringBuilder当中。
TextReader:表示可以读取连续字符系列的读取器。
TextWriter:表示可以编写一个有序字符系列的编写器。该类为抽象类。

2、文件基本操作

对文件进行操作的时候,主要用到.NET类库中提供的File类和FileInfo类,而常见的文件操作主要有以下几种方式:判断文件是否存在、创建文件、打开文件、复制文件、移动文件、删除文件以及获取文件的基本信息等。

(1)File类和FileInfo类
File类和FileInfo类都可以对文件进行创建、复制、删除、移动、打开、读取以及获取文件的基本信息等操作。

File类
File类支持对文件的基本操作,包括提供用于创建、复制、删除、移动、打开、读取以及获取文件的静态方法。并且协助创建FileStream对象。由于所有File类的方法都是静态的,所以如果只想执行一个操作,那么使用File方法的效率比使用相应的FileInfo实例方法可能更高。File类可以被创建,但是不能被其他类继承。
File类常用的方法以及说明:

AppendAllTest:将指定的字符串追加到文件中,如果文件不存在则创建文件。
AppendTest:创建一个StreamWriter,它将UTF-8编码文本追加到现有文件。
Create:在指定路径中创建文件。
Copy:将现有文件复制到新文件中。
CreateText:创建或打开一个文件用于写入UTF-8编码的文本。
Decrypt:解密由当前账户使用Encrypt方法加密的文件。
Delete:删除指定文件。如果指定的文件不存在,则不引发异常。
Encrypt:将某个文件加密,使得只有加密该文件的账户才能将其解密。
Exists:确定指定的文件是否存在。
GetCreationTime:返回指定文件或者目录创建日期和时间。
GetLastAccessTime:返回上次访问指定文件或目录的日期和时间。
GetLastWriterTime:返回上次写入指定文件或目录的日期和时间。
Move:将指定文件移动到新位置,并且提供指定新文件名的选项。
Open:打开指定路径上的FileStream。
OpenRead:打开现有文件进行读取。
OpenText:打开现有UTF-8编码文本文件进行读取。
OpenWrite:打开现有文件以进行读取。
ReadAllBytes:打开一个文件,将文件的内容读入一个字符串,然后关闭该文件。
ReadAllLines:打开一个文本文件,将文件的所有行都读入一个字符串数组,然后关闭该文件。
ReadAllText:打开一个文本文件,将文件的所有行读入一个字符串,然后关闭该文件。
Replace:使用其他文件的内容替换指定文件的内容,这一过程将删除原始文件,并且创建被替换文件的备份。
SetCreationTime:设置创建该文件的日期和时间。
SetLastAccessTime:设置上次访问指定文件的日期和时间。
SetLastWriterTime:设置上次写入指定文件的日期和时间。
WriteAllBytes:创建一个新文件。在其中写入指定的字节数组,然后关闭该文件。如果目标文件已存在,则颠覆该文件。
WriteAllLines:创建一个新文件,在其中写入指定的字符串,然后关闭文件。如果目标文件已经存在,则覆盖该文件。
WriteAllText:创建一个新文件,在文件中写入内容,然后关闭文件。如果目标文件已存在则覆盖该文件。

注意:UTF-8是一种编码方式,表示每一个Unicode字符,已经过优化以尽可能提高速度,比其他编码方式都要更快速。

示例程序:创建文本文件:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == string.Empty)
            {
                MessageBox.Show("you must to fill the testbox");
            }

            else
            {
                if (File.Exists(textBox1.Text))
                {
                    MessageBox.Show("this file has been there!");
                }
                else
                {
                    File.Create(textBox1.Text);
                }
            }
        }
    }

FileInfo类
FileInfo类和File类当中有很多方法都是共用的,但是FileInfo类没有静态方法,仅可以用于创建对象。File类是静态类,所以他的调用需要字符串参数为每一个方法调用规定文件位置,因此如果要在对象上进行单一方法调用,则可以使用静态File类,反之使用FileInfo类。
FileInfo类常用的属性和说明:

Attributes:获取或设置当前Filesysteminfo的FileAttributes。
CreationTime:获取或者设置当前Filesysteminfo对象的创建时间。
DirectoryName:获取表示目录的完整路径的字符串。
Exists:获取指示文件是否存在的值。
Extension:获取表示文件扩展名部分的字符串。
FullName:获取目录或文件的完整目录。
Length:获取当前文件的大小。
Name:获取文件名。

关于创建文件的示例程序重写:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == string.Empty)
            {
                MessageBox.Show("you must to fill the testbox");
            }

            else
            {
                FileInfo f = new FileInfo(textBox1.Text);

                if (f.Exists)//使用FileInfo对象的Exists属性判断要创建的文件是否存在
                {
                    MessageBox.Show("this file has been there!");
                }
                else
                {
                    f.Create(); //使用FileInfo类的创建方法
                }
            }
        }
    }

(2)判断文件是否存在
File类:

public static bool Exists(string path)
//参数path表示要检查的文件。如果调用方具有要求的权限并且path包含现有文件的名称,则该方法返回true,否则为false。如果path为空引用或者零长度字符串,则此方法返回false

FileInfo类:

public override bool Exists{get;}
//如果文件存在,该属性为true.否则为false。

注意:如果File类不知名路径那么默认为应用程序当前路径。

以上具体程序实例见上文示例程序。

(3)创建文件
创建文件可以用File类中的Create方法,或者FileInfo类的Create方法来实现。

File类:

public static FileStream Create(string path)
public static FileStream Create(string path,int buffersize)
public static FileStream Create(string path,int buffersize,FileOption options)
public static FileStream Create(string path,int buffersize,FileOption options,FileSecurity fileSecurity)

相关参数说明:
path:文件名。
bufferSize:用于读取和写入文件的已放入缓冲区的字节数。
options:FileOptions值之一,描述如何创建或改写文件。
fileSecurity:FileSecurity值之一,确定文件的访问控制和审核安全性。

FileInfo类:

public FileStream Create()
//该方法返回文件流,默认情况下,该方法将向所有用户手语对新文件的完全读写访问权限。

(4)打开文件
用户打开文件可以有三种方式:
读写方式打开文件
只读方式打开文件
写入方式打开文件
可以使用File类和FileInfo类实现文件的打开操作。

以读写方式打开文件
以读写方式打开文件是用File类的Open方法实现的,该方法用于打开指定路径上的FileStream对象,并且具有读写访问权限。
语法:

public static FileStream Open(string path,FileMode mode)
//参数path表示要打开的文件路径,mode为FileMode的枚举值之一。用于指定在文件不存在时是否创建该文件,并且确定是保留还是覆盖现在文件的内容。返回值为FileStream类。表示以制定模式打开指定路径上的FileStream。具有读写访问权限并且并不分享。
FileMode枚举值成员以及说明:

CreateNew:指定操作系统应创建新文件。
Create:指定操作系统应创建新文件。如果文件存在,将被覆盖。
Open:指定操作系统应打开现在文件。
OpenOrCreate:指定操作系统应打开文件(如果文件存在),否则应该创建文件。
Truncate:指定操作系统应打开现有文件。文件一旦打开,就将被截断为0字节大小。
Append:打开现有文件并查找到文件尾,或创建新文件。

相关使用方法:

FileStream fs=File.Open(path,FileMode.Open)
//打开一个可读写文件
FileStream fs=File.Open(path,FileMode.OpenOrCreate)
//打开一个不存在的文件的时候,用读写方式创建文件并打开。
FileStream fs=File.Open(path,FileMode.Truncate)
//打开文件的时候,清空文件中所有内容并且进行读写操作。
FileStream fs=File.Open(path,FileMode.Append)
//打开文件后将光标移动到文件尾,然后在文件尾进行读写操作。

打开文件的时候,可以用FileInfo类实现,其调用方法基本相同。

关于using的用法

FileInfo fileInfo =new FileInfo("text.txt");
using (Stream stream=fileInfo.Open(FileMode.Open))
{
Byte[]info=new UTF8Encoding(true).GetBytes("民以食为天");
stream.Write(info,0,info.Length);
}

关于C#中的event运行机制

关于IO流写入
示例程序:

       pp += TEMP.GetString(b);//累加读取的结果
                    }
                    MessageBox.Show(pp);//显示文本的内容
                }
            }
                //如果出错的话
            catch
            {
                if (MessageBox.Show("there is no file create one?", "indicate", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    FileStream fs = File.Open(path,FileMode.CreateNew);//在指定路径下创建文件
                    fs.Dispose();//删除流
                }
            }
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (((RadioButton)sender).Checked == true)//判断单选项的选中情况
            {
                switch (Convert.ToInt32(((RadioButton)sender).Tag.ToString()))
                {
                    case 0: fileM = FileMode.Open; break;
                    case 1: fileM = FileMode.Append; break;
                    case 2: fileM = FileMode.Truncate; break;
                    case 3: fileM = FileMode.Create; break;
                }
            }
        }

    }

注意:添加了四个单选控件之后,将该类控件的tag属性设置为0、1、2、3,用于判断文件的打开方式,然后在将单靴控件的CheckedChange事件获取文件的打开方式,为了减少代码量,将其他3个单选控件的CheckedChanged事件指向radioButton1控件的CheckChanged事件。
注意:使用File类和FileInfo类创建文本文件时,其默认的字符编码为UTF-8,而在Windows手动创建文本文件的时候,其字符编码为ANSI

用只读方式打开文件
以只读方式打开文件使用File类的OpenRead方法实现的,该方法用于打开现有文件并对其进行读取。
语法:

public static FileStream OpenRead(string path)
//表示以只读方式打开指定路径上的FileStream

//如果指向读取UTF-8文本可以使用下述方法:
public static StreamReader OpenText(string path)

示例程序:

using (StreamReader sr=File.OpenText(path))
{
string s="";
while((s=sr.ReadLine())!=null)
{
MessageBox.Show(s);
}
}

以写入方式打开文件
以写入方式打开文件是用File类的OpenWrite实现的,该方法用于打开现有文件进行写入。语法:

public static FileStream OpenWrite(path);
//参数path表示要打的文件路径
FileStream fs=File.OpenWrite(path);

(5)复制文件
复制文件的时,可以使用File类的Copy方法或者FileInfo类的CopyTo方法来实现,下面分别对它们进行介绍。
File类
File类的Copy方法为可重载方法,他有以下两种重载形式:

public static void Copy(string sourceFileName,string destFileName)
public static void Copy(string sourceFileName,string destFileName,bool override)
//参数 sourceFileName表示要复制的文件。参数destFileName表示目标文件的名称,不能是目录,如果是第一种重载形式,该参数不能是现有文件。参数override表示如果可以改写目标文件,则为true,否则为false

FileInfo类
FileInfo类的CopyTo方法为可重载方法,有以下两种重载方式:

public FileInfo CopyTo(string destFileName)
public FileInfo CopyTo(string destFileName,bool overwrite)
//override如果为true,那么允许改写现有文件,否则为false。第一种重载形式的返回值为带有完全限定路径的新文件。第二种重载形式的返回值为新文件,如果overwrite为true,则为现有文件的改写,如果违建存在,而且overridefalse,那么会发生IOException。

(6)移动文件
移动文件的时候,可以使用File类的Move方法或者FileInfo类的MoveTo方法来实现,下面分别对他们进行介绍。

File类的Move方法:
File类的Move方法是将指定文件移动到新位置,并且提供指定新文件名的选项。语法:

public static void Move(string sourceFileName,string destFileName)
// sourceFileName表示要移动文件的名称,destFileName表示文件的新路径。

注意:提供新路径,如果目录是相同的路径,可以进行文件的名字修改。

FileInfo类
MoveTo方法是将制定文件移动到新位置,并且提供指定新文件名的选项。

public void MoveTo(string destFileName)
//参数destFileName表示要将文件移动到的路径,可以指定另一个文件名。

注意:开发人员使用MoveTo/Move方法改写现有文件的时候,如果源文件和目标文件是同一个文件,将会产生IOException异常。

(7)删除文件

File类
File类的Delete方法是删除指定的文件。语法:

public static void Delete(string path) 
//path表示要删除的文件的名称

如果当前删除的文件正在被使用,删除的时候将会引发异常。

FileInfo类的Delete方法
该方法是永久删除文件。

public override void Delete()
//无返回值

(8)获取文件的基本信息
获取文件的基本信息时,主要用到了FileInfo类中的各种属性。下面通过一个实例说明如何获取文件的基本信息:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;
                FileInfo f = new FileInfo(textBox1.Text);
                string strCTime;
                string strLATime;
                string strLWTime;
                string strName;
                string strFName;
                string strDname;
                string strISRead;
                long lgLength;
                strCTime = f.CreationTime.ToShortDateString();
                strLATime = f.LastAccessTime.ToShortDateString();
                strLWTime = f.LastWriteTime.ToShortDateString();
                strName = f.Name;
                strFName = f.FullName;
                strDname = f.DirectoryName;
                strISRead = f.IsReadOnly.ToString();
                lgLength = f.Length;
                MessageBox.Show("文件信息\n创建时间:"+strCTime+"上次访问时间:"+strLATime
                    +"\n上次写入时间:"+strLWTime+"文件名称: "+strName+"\n完整目录:"+strFName+
                    "\n完整路径:"+strDname+"\n是否只读:"+strISRead+"文件长度:"+lgLength);
            }
        }
    }

注意在程序中引入OpenFileDialog控件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值