using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
// 创建一个StreamWriter对象,使用UTF-8编码格式
using (StreamWriter writer = new StreamWriter(fs, Encoding.UTF8))
{
// 分别写入十进制数,字符串和字符类型的数据
writer.WriteLine(123.45M);
writer.WriteLine("String Data");
writer.WriteLine('A');
}
}
// 以只读模式打开一个文本文件
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
using (StreamReader reader = new StreamReader(fs, Encoding.UTF8))
{
string text = string.Empty;
while(!reader.EndOfStream)
{
text = reader.ReadLine();
txtMessage.Text += text + Environment.NewLine;
}
}
}
using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
using (BinaryWriter writer = new BinaryWriter(fs))
{
// 写入十进制数,字符串和字符
writer.Write(234.56M);
writer.Write("String");
writer.Write('!');
}
}
读取文件的示例:
// 以只读模式打开一个二进制文件
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs))
{
MessageBox.Show("全部数据:" + sr.ReadToEnd());
fs.Position = 0;
using (BinaryReader reader = new BinaryReader(fs))
{
// 选用合适的数据类型读取数据
string message = reader.ReadDecimal().ToString() + Environment.NewLine;
message += reader.ReadString() + Environment.NewLine;
message += reader.ReadChar().ToString();
MessageBox.Show(message);
}
}
}
问题3:如何异步读取文件;
解决方案:
有时你需要读取一个文件但又不希望影响程序的执行。常见的情况是读取一个存储在网络驱动器上的文件。
FileStream提供了对异步操作的基本支持,即它的BeginRead和EndRead方法。使用这些方法,可以在.NET Framework线程池提供的线程中读取一个数据块,而无须直接与System.Threading命名空间中的线程类打交道。
采 用异步方式读取文件时,可以选择每次读取数据的大小。根据情况的不同,你可能会每次读取很小的数据(比如,你要将数据逐块拷贝至另一个文件),也可能是一 个相对较大的数据(比如,在程序逻辑开始之前需要一定数量的数据)。在调用BeginRead时指定要读取数据块的大小,同时传入一个缓冲区 (buffer)以存放数据。因为BeginRead和EndRead需要访问很多相同的信息,如FileStream,buffer,数据块大小等,因 此将这些内容封装一个单独的类当中是一个好主意。
下面这个类就是一个简单的示例。AsyncProcessor类提供了StartProcess 方法,调用它开始读取,每次读取操作结束,OnCompletedRead回调函数会被触发,此时可以处理数据,如果还有剩余数据,则开始一个新的读取操 作。默认情况下,AsyncProcessor类每次读取2KB数据。
class AsyncProcessor
{
private Stream inputStream;
// 每次读取块的大小
private int bufferSize = 2048;
public int BufferSize
{
get { return bufferSize; }
set { bufferSize = value; }
}
// 容纳接收数据的缓存
private byte[] buffer;
public AsyncProcessor(string 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);
}
private void OnCompletedRead(IAsyncResult asyncResult)
{
// 已经异步读取一个 块 ,接收数据
int bytesRead = inputStream.EndRead(asyncResult);
// 如果没有读取任何字节,则流已达文件结尾
if (bytesRead > 0)
{
// 暂停以模拟对数据块的处理
Debug.WriteLine(" 异步线程:已读取一块");
Thread.Sleep(TimeSpan.FromMilliseconds(20));
// 开始读取下一块
inputStream.BeginRead(buffer, 0, buffer.Length, OnCompletedRead, null);
}
else
{
// 结束操作
Debug.WriteLine(" 异步线程:读取文件结束");
inputStream.Close();
}
}
}
// 开始在另一线程中异步读取文件
AsyncProcessor asyncIO = new AsyncProcessor("test.txt");
asyncIO.StartProcess();
// 在主程序中,做其它事情,这里简单地循环10秒
DateTime startTime = DateTime.Now;
while (DateTime.Now.Subtract(startTime).TotalSeconds < 10)
{
Debug.WriteLine("主程序:正在进行");
// 暂停线程以模拟耗时的操作
Thread.Sleep(TimeSpan.FromMilliseconds(100));
}
Debug.WriteLine("主程序:已完成");
string tempFile = Path.GetTempFileName();
using (FileStream fs = new FileStream(tempFile, FileMode.Open))
{
using (BinaryWriter writer = new BinaryWriter(fs))
{
// 写入数据
writer.Write("临时文件信息");
}
}
// Do something
// 最后删除临时文件
File.Delete(tempFile);
// 设置相关属性
watcher.Path = appPath;
watcher.Filter = "*.txt";
watcher.IncludeSubdirectories = true;
// 添加事件处理函数
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
void OnRenamed(object sender, RenamedEventArgs e)
{
string renamedFormat = "File: {0} 被重命名为 :{1}";
txtChangedInfo.Text = string.Format(renamedFormat, e.OldFullPath, e.FullPath);
}
void OnChanged(object sender, FileSystemEventArgs e)
{
// 显示通知信息
txtChangedInfo.Text = "文件: " + e.FullPath + "发生改变" + Environment.NewLine;
txtChangedInfo.Text += "改变类型: " + e.ChangeType.ToString();
}
// 创建当前用户的独立存储
using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForAssembly())
{
// 创建一个文件夹
store.CreateDirectory("MyFolder");
// 创建一个独立存储文件
using (Stream fs = new IsolatedStorageFileStream("MyFile.txt", FileMode.Create, store))
{
StreamWriter writer = new StreamWriter(fs);
writer.WriteLine("Test Line!");
writer.Flush();
}
Debug.WriteLine("当前大小:" + store.CurrentSize.ToString() + Environment.NewLine);
Debug.WriteLine("范围:" + store.Scope.ToString() + Environment.NewLine);
string[] files = store.GetFileNames("*.*");
if (files.Length > 0)
{
Debug.WriteLine("当前文件:" + Environment.NewLine);
foreach (string file in files)
{
Debug.WriteLine(file + Environment.NewLine);
}
}
}
联系客服