我需要使用FileStream和下面提到的选项在C#中打开一个文本文件
var fileStream = new FileStream(filePath,
FileMode.Open,
FileAccess.Read,
FileShare.Read, 64 * 1024,
(FileOptions)FILE_FLAG_NO_BUFFERING |
FileOptions.WriteThrough & FileOptions.SequentialScan);
文本文件包含“1”或“0”,在获得结果后,我将文本文件的内容分配给字符串变量。如果你感兴趣,我需要上面的选项,以避免Windows从缓存中读取文本文件。
System.IO.File.ReadAllText()
......不够好。
有人会友好地编写一个简单的子程序,其中包含了这些要求,因为我到目前为止看到的示例涉及使用字节和缓冲区(此时我真正需要处理的一个区域)并离开就在那。
由于
答案 0 :(得分:20)
可能是这样的:
FileStream fileStream = new FileStream("[path]", FileMode.Open, FileAccess.Read, FileShare.Read, 64 * 1024,
(FileOptions)0x20000000 | FileOptions.WriteThrough & FileOptions.SequentialScan);
string fileContents;
using (StreamReader reader = new StreamReader(fileStream))
{
fileContents = reader.ReadToEnd();
}
bool assignedvariable = Convert.ToBoolean(fileContents);
如果文件包含1,则assignvariable将为true,如果包含0,则为false。
很抱歉,如果已经回复,那么人们在这里发帖很快。
答案 1 :(得分:10)
您可以使用StreamReader从流中读取:
string contents;
using(var sr = new StreamReader(fileStream))
{
contents = sr.ReadToEnd();
}
答案 2 :(得分:3)
File.ReadAllBytes
或
File.ReadAllText
理论上两者都会使用Windows文件缓存。
阅读this以获取更多理解以及对FILE_FLAG_NO_BUFFERING的一些限制,并阅读this for a similar stackoverflow question
答案 3 :(得分:0)
这就是我使用 FileStream 读取字节数组所做的工作,并且效果很好。为了技术清晰起见,我扩展了名称空间。您应该根据情况选择 FileShare 和 FileAccess 参数。
byte[] buffer = null;
using (System.IO.FileStream stm = new System.IO.FileStream("c:\\YourFile.txt",
System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None))
{
buffer = new byte[stm.Length];
stm.Read(buffer, 0, Convert.ToInt32(stm.Length));
}
如何将文件内容读取为字符串而不是字节数组?
string buffer = null;
using (System.IO.FileStream stm = new
System.IO.FileStream("c:\\YourFile.txt",System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.None))
{
using (System.IO.StreamReader rdr = new System.IO.StreamReader (stm))
{
buffer=rdr.ReadToEnd();
}
}
为什么StreamReader比使用所需的编码将byte []转换为字符串更好?
StreamReader类功能强大,因为它将检查标头字节并为您确定编码方案。您不必使用 System.Text.Encoding.UTF8.GetString()。
为什么使用FileStream,为什么不使用System.IO.File.ReadAllBytes / ReadAllText? 我想精确控制文件锁定机制。在我的方案中,我有一个过程正在轮询文件夹中的传入文件。我想确保在读取文件时,另一端运行缓慢的进程已完成其工作,并且文件已准备就绪,可供我的进程读取和分析。
将整个文件读取为单个字节数组有什么缺点? 如果要一次读取一个非常大的文件,那么对RAM的需求就更高。考虑一个渲染电影的应用程序。您有一个100MB的电影文件。您不想一次读取整个文件。您宁愿一次读取100KB的块,渲染场景,然后继续进行下一个块。这使您的应用程序更具可扩展性。电影应用程序现在具有更高的可伸缩性。您可以处理非常大的电影,而不会遇到System.IO.OutOfMemoryException的风险。