文件读写相关类简介
文件读写操作涉及的主要类是:
在使用它们之前,最好先了解它们的继承关系,这有助于做出最合适的选择。
还要注意FileInfo和File类的某些方法,例如Create,CreateText,Open等,这些方法有时会带来便利。这些类别中的内容很多,请参阅MSDN以获取更多内容。
一些常见问题及其解决方法
问题1:如何读写文本文件(并考虑不同的编码类型)
解决方案:
创建一个FileStream对象以引用该文件。要写入文件,请将FileStream对象封装在StreamWriter对象中,并使用其重载的Write方法。读取文件,将FileStream对象封装在StreamReader对象中,并使用其Read或ReadLine方法;
.NET Framework允许通过StreamWriter和StreamReader类操纵任何流以读取和写入文本文件。使用StreamWriter类写入数据时,请调用其Write方法,该方法可以在重载后支持所有常见的C#数据类型,包括字符串,字符,整数,浮点数和十进制数。但是Write方法将始终将获取的数据转换为文本。如果要将文本转换回原始数据类型,则应使用WriteLine方法来确保每个值都在单独的行上。
字符串的表示形式取决于您使用的编码。最常见的编码类型包括:ASCII,UTF-16,UTF-7,UTF-8。
.NET Framework为System.Text命名空间中的每种编码类型提供了一个类。使用StreamWriter和StreamReader类时,可以指定所需的编码类型,也可以使用默认的UTF-8。
读取文本文件时,请使用StreamReader类的Read或ReadLine方法。 Read方法读取单个字符或指定数量的字符,返回类型为字符或字符数组。 ReadLine方法返回包含整个行的字符串; ReadToEnd方法从当前位置读取到流的末尾。
编写文本文件的示例:
使用(FileStream fs = new FileStream(fileName,FileMode.Create))
{
///使用UTF-8编码格式创建StreamWriter对象
使用(StreamWriter writer = new StreamWriter(fs,Encoding.UTF 8))
{
//分别写入十进制数字,字符串和字符类型数据
writer.WriteLine(12 3. 45M);
writer.WriteLine(“字符串数据”);
writer.WriteLine('A');
}
}
读取文本文件的示例:
//以只读模式打开文本文件
使用(FileStream fs = new FileStream(fileName,FileMode.Open))
{
使用(StreamReader reader = new StreamReader(fs,Encoding.UTF 8))
{
字符串文本= string.Empty;
while(!reader.EndOfStream)
{
text = reader.ReadLine();
txtMessage.Text + =文本+ Environment.NewLine;
}
}
}
问题2:如何读写二进制文件(使用强数据类型)
解决方案:
创建一个FileStream对象以引用该文件。要写入文件,请将FileStream对象封装在BinaryWriter对象中,并使用其重载的Write方法。读取文件,将FileStream对象封装在BinaryReader对象中,并使用相应数据类型的Read方法。
.NET Framework允许操作任何流以通过BinaryWriter和BinaryReader类读取和写入二进制数据。使用BinaryWriter类写入数据时,请调用其Write方法,该方法可以在重载后支持所有常见的C#数据类型,包括字符串,字符,整数,浮点数,十进制数等,然后对数据进行编码要将一系列字节写入文件,您还可以在此过程中配置编码类型。
使用二进制文件时,请务必特别注意其中的数据类型。读取数据时,必须使用BinaryReader类的某种强类型的Read方法。例如,要读取字符串,请使用ReadString方法。 (BinaryWriter在编写二进制文件时将始终记录字符串的长度,以避免任何可能的错误)
编写文件的示例:
使用(FileStream fs = new FileStream(fileName,FileMode.Create))
{
使用(BinaryWriter writer =新的BinaryWriter(fs))
{
//写十进制数字,字符串和字符
writer.Write(23 4. 56M);
writer.Write(“ String”);
writer.Write('!');
}
}
读取文件的示例:
//以只读模式打开二进制文件
使用(FileStream fs = new FileStream(fileName,FileMode.Open))
{
使用(StreamReader sr = new StreamReader(fs))
{
MessageBox.Show(“所有数据:” + sr.ReadToEnd());
fs.Position = 0;
使用(BinaryReader reader = new BinaryReader(fs))
{
//选择适当的数据类型以读取数据
字符串消息= reader.ReadDecimal()。ToString()+ Environment.NewLine;
消息+ = reader.ReadString()+ Environment.NewLine;
消息+ = reader.ReadChar()。ToString();
MessageBox.Show(message);
}
}
}
问题3:如何异步读取文件
解决方案:
有时您需要读取文件,但又不想影响程序的执行。常见的情况是读取存储在网络驱动器上的文件。
FileStream为异步操作提供基本支持,即其BeginRead和EndRead方法。使用这些方法,您可以在.NET Framework线程池提供的线程中读取数据块,而无需直接处理System.Threading命名空间中的线程类。
异步读取文件时,可以选择每次读取的数据大小。根据情况,您可能每次都读取非常小的数据(例如,要将数据块逐块复制到另一个文件),或者可能是相对较大的数据(例如,在程序逻辑开始之前)一定数量的数据)。调用BeginRead时,指定要读取的数据块的大小,然后传入缓冲区以存储数据。因为BeginRead和EndRead需要访问许多相同的信息,例如FileStream,缓冲区,数据块大小等,所以最好将这些内容封装在一个单独的类中。
以下类是一个简单的示例。 AsyncProcessor类提供了StartProcess方法,该方法被调用以开始读取。每次读取操作结束时,都会触发OnCompletedRead回调函数,并且此时可以处理数据。如果有剩余数据,将开始新的读取操作。默认情况下,AsyncProcessor类一次读取2KB数据。
编写文件的示例:
使用(FileStream fs = new FileStream(fileName,FileMode.Create))
{
使用(BinaryWriter writer =新的BinaryWriter(fs))
{
//写十进制数字,字符串和字符
writer.Write(23 4. 56M);
writer.Write(“ String”);
writer.Write('!');
}
}
AsyncProcessor类
{
私有流inputStream;
//每个读取块的大小
private int bufferSize = 2048;
public int BufferSize
{
get {返回bufferSize; }
set {bufferSize = value; }
}
//用于接收数据的缓存
私有字节[]缓冲区;
公共AsyncProcessor(字符串fileName)
{
buffer = new byte [bufferSize];
//打开文件并将参数指定为true,以提供对异步操作的支持
inputStream = new FileStream(fileName,FileMode.Open,FileAccess.Read,FileShare.Read,bufferSize,true);
}
public void StartProcess()
{
//开始异步读取文件并填充缓冲区
inputStream.BeginRead(buffer,0,buffer.Length,OnCompletedRead,null);
}
私有无效OnCompletedRead(IAsyncResult asyncResult)
{
//已异步读取一个块并接收了数据
int bytesRead = inputStream.EndRead(asyncResult);
//如果未读取任何字节,则说明流已到达文件末尾
if(bytesRead> 0)
{
//暂停以模拟数据块的处理
Debug.WriteLine(“异步线程:已读取一个块”);
Thread.Sleep(TimeSpan.FromMilliseconds(2 0));
//开始阅读下一个程序段
inputStream.BeginRead(buffer,0,buffer.Length,OnCompletedRead,null);
}
其他
{
//结束操作
Debug.WriteLine(“异步线程:读取文件结束”);
inputStream.Close();
}
}
}
使用此类时,您可以这样编写:
//开始在另一个线程中异步读取文件
AsyncProcessor asyncIO =新的AsyncProcessor(“ test.txt”);
asyncIO.StartProcess();
//在主程序中,执行其他操作,这里只需循环10秒
DateTime startTime = DateTime.Now;
while(DateTime.Now.Subtract(startTime).TotalSeconds
{
Debug.WriteLine(“主程序:正在进行中”);
//暂停线程以模拟耗时的操作
Thread.Sleep(TimeSpan.FromMilliseconds(10 0));
}
Debug.WriteLine(“主程序:已完成”);
问题4:如何创建临时文件
解决方案:
有时,必须在特定用户的临时目录中创建一个临时文件。这要求文件具有唯一的名称,以避免与其他程序生成的临时文件冲突。我们将有多种选择。最简单的方法是使用GUID或时间戳加一个随机值作为程序所在目录中的文件名。但是Path类提供的方法仍然可以节省您的工作。这是它的静态GetTempFileName方法,该方法在当前用户的临时目录中创建一个临时文件(文件名必须是唯一的)。临时目录通常与此类似:C:\ Documents and Settings \ [用户名] \ Local Settings \ Temp。
字符串tempFile = Path.GetTempFileName();
使用(FileStream fs = new FileStream(tempFile,FileMode.Open))
{
使用(BinaryWriter writer =新的BinaryWriter(fs))
{
//写入数据
writer.Write(“临时文件信息”);
}
}
//最后删除临时文件
File.Delete(tempFile);
问题5:如何获取随机文件名
解决方案:
使用Path.GetRandomFileName方法,该方法不同于GetTempFileName方法,因为它仅返回一个字符串,但不创建文件。
问题6:监视文件系统更改
解决方案:
如果指定路径中的文件发生了更改(例如,文件被修改或创建),则希望能够对此做出反应。
如果该程序与多个其他程序或业务流程相关,则通常有必要创建一个程序,并且该程序仅在文件系统更改时才处于活动状态。您可以创建一个这样的程序,并让它定期检查指定的目录。这时,您会发现一些困扰您的事情:检测越频繁,就会浪费更多的系统资源;并且检测越少,将检测到更多的系统资源。更改时间越长。
这时,您可以使用FileSystemWatcher组件指定要监视的目录或文件,并处理其创建,删除,重命名和更改事件。
要使用FileSystemWatcher组件,必须首先创建它的一个实例,然后设置以下属性:
//设置相关属性
watcher.Path = appPath;
watcher.Filter =“ * .txt”;
watcher.IncludeSubdirectories = true;
//添加事件处理功能
watcher.Created + =新的FileSystemEventHandler(OnChanged);
watcher.Deleted + = new FileSystemEventHandler(OnChanged);
watcher.Changed + =新的FileSystemEventHandler(OnChanged);
watcher.Renamed + = new RenamedEventHandler(OnRenamed);
void OnRenamed(对象发送者,RenamedEventArgs e)
{
stringnamedFormat =“文件:{0}已重命名为:{1}”“;
txtChangedInfo.Text = string.Format(renamedFormat,e.OldFullPath,e.FullPath);
}
void OnChanged(对象发送者,FileSystemEventArgs e)
{
//显示通知信息
txtChangedInfo.Text =“文件:” + e.FullPath +“已更改” + Environment.NewLine;
txtChangedInfo.Text + =“更改类型:” + e.ChangeType.ToString();
}
问题7:如何使用独立的存储文件
解决方案:
有时您需要将数据存储在文件中,但是您没有对本地硬盘驱动器的必要权限(FileIOPermission)。此时,您需要使用System.IO.IsolatedStorage命名空间中的类。这些类使您的程序可以将数据写入特定用户目录中的文件,而无需直接访问硬盘驱动器。
//为当前用户创建独立的存储空间
使用(IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForAssembly())
{
//创建一个文件夹
store.CreateDirectory(“ MyFolder”);
//创建一个独立的存储文件
使用(流fs =新的IsolatedStorageFileStream(“ MyFile.txt”,FileMode.Create,存储))
{
StreamWriter writer =新的StreamWriter(fs);
writer.WriteLine(“测试线!”);
writer.Flush();
}
Debug.WriteLine(“当前大小:” + store.CurrentSize.ToString()+ Environment.NewLine);
Debug.WriteLine(“ Scope:” + store.Scope.ToString()+ Environment.NewLine);
string []文件= store.GetFileNames(“ *。*”);
if(files.Length> 0)
{
Debug.WriteLine(“当前文件:” + Environment.NewLine);
foreach(文件中的字符串文件)
{
Debug.WriteLine(文件+ Environment.NewLine);
}
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/dianqi/article-363461-1.html
这次就应好好利用