b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

c# 硬盘块写入 【初中英语】文件读写相关类介绍(二)

电脑杂谈  发布时间:2021-03-10 09:03:30  来源:网络整理

文件读写相关类简介

文件读写操作涉及的主要类是:

在使用它们之前,最好先了解它们的继承关系,这有助于做出最合适的选择。

还要注意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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...