【问题标题】:Read the actual contents of text file using FileStream and these options c#使用 FileStream 和这些选项 c# 读取文本文件的实际内容
【发布时间】:2012-12-17 13:52:12
【问题描述】:

我需要在 C# 中使用 FileStream 和下面提到的选项打开一个文本文件

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()

...还不够好。

有人愿意为我编写一个包含这些要求的简单子程序吗就这样吧。

谢谢

【问题讨论】:

  • “System.IO.File.ReadAllText() ... 还不够好。”?为什么?
  • @SteveB 我认为是因为您无法指定共享状态。

标签: c# filestream


【解决方案1】:

可能是这样的:

    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,完成了这项工作。
【解决方案2】:

您可以使用StreamReader 从流中读取:

string contents;
using(var sr = new StreamReader(fileStream))
{
   contents = sr.ReadToEnd();
}

【讨论】:

    【解决方案3】:

    这就是我使用 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 类功能强大,因为它将检查标头字节并为您确定编码方案。您不必使用 System.Text.Encoding.UTF8.GetString()

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

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

    【讨论】:

      【解决方案4】:
      File.ReadAllBytes
      

      File.ReadAllText
      

      理论上两者都会使用 windows 文件缓存。

      阅读this 了解更多信息以及对FILE_FLAG_NO_BUFFERING 的一些限制,另请阅读this for a similar stackoverflow question

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 2018-01-16
        • 2010-11-04
        • 1970-01-01
        相关资源
        最近更新 更多