使用FileStream以及以下选项读取文本文件的实际内容 c#

29

我需要使用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()

......不够好。

请问有没有人能够友好地为我编写一个简单的子程序来满足这些要求?因为我目前还需要在字节和缓冲区方面工作,而我看到的例子都只是介绍了这些,并没有深入讲解。

谢谢!


1
"System.IO.File.ReadAllText()不够好。"?为什么? - Steve B
1
@SteveB 我猜是因为你无法指定共享状态。 - ThunderGr
4个回答

39
也许是类似这样的东西:
    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,则assignedvariable将为true,如果文件包含0,则为false。

如果这个问题已经被回答过了,那么很抱歉,人们在这里发布得非常快。


谢谢 Dave,干得好。 - user1776480

23
您可以使用StreamReader从流中读取:
string contents;
using(var sr = new StreamReader(fileStream))
{
   contents = sr.ReadToEnd();
}

12

这是我使用FileStream成功读取字节数组的方法。出于技术上的明确性,我扩展了命名空间。根据您的情况,您应该选择FileShareFileAccess参数。

    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类非常强大,因为它会检查头字节并为您确定编码方案。您不必使用。

为什么要使用FileStream,而不使用System.IO.File.ReadAllBytes/ReadAllText? 我想对文件锁定机制进行精确控制。在我的场景中,我有一个进程正在轮询传入文件的文件夹。我想确保当我读取文件时,另一端的慢速运行进程已经完成了其工作,并且文件已准备好供我的进程读取和分析。

将整个文件作为单个字节数组读取的缺点是什么? 如果您要一次性读取非常大的文件,则会对RAM产生更高的需求。想象一下渲染电影的应用程序。您有一个100MB的电影文件。您不想一次性读取整个文件。您希望一次读取100KB的块,渲染场景,然后转到下一个块。这使您的应用程序更具可扩展性。您的电影应用程序现在更具可扩展性。您可以处理非常大的电影,而不会遇到System.IO.OutOfMemoryException的风险。


5
File.ReadAllBytes

或者

File.ReadAllText

理论上,它们都将使用Windows文件缓存。

要更深入地了解FILE_FLAG_NO_BUFFERING的某些限制,请阅读此文,也可以阅读这个类似的stackoverflow问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接