将文件转换为流的最快方法[关闭]

问题描述 投票:-2回答:2

我用Google做的,看到了读写文件的不同方法,但是我需要最快的方法将文件转换为流。

我正在努力提高一种将文件简单地转换为流的方法的性能。这将被称为每天无数次,我们正在寻求改善其性能。请看下面我写的方法。

public static Stream GetFileStream(string fileName)
{
   Stream result;
   try
   {
      if (File.Exists(fileName))
      {
          result = File.OpenRead(fileName);
          if (result.Length > 0)
          {
              result.Seek(0, SeekOrigin.Begin);
          }
      }
      else
      {
         throw new Exception(string.Format("{0} file not found.", fileName));
      }
   }
   catch (Exception ex)
   {
       throw ex;
   }
   return result;
}

示例测试调用代码(我没有控制权,如下所示)

List<string> fileNames = new List<string>();
//add almost 30,000 file names to string

List<Stream> fileStreams = new List<Stream>();
foreach(string fileName in fileNames)
{
   Stream fileStream = FileUtility.GetFileStream(fileName);
   fileStreams.Add(fileStream);
}

我正在研究如何提高我的方法ConvertToStream的性能。

提前感谢。

UPDATE 1

根据下面的朋友,我转换了我的方法,如下所示

public static Stream ConvertToStream(string fileName)
{
   Stream result;
   try
   {
      result = File.OpenRead(fileName);        
   }
   catch (Exception ex)
   {
      throw ex;
   }
   return result;
}

我将让您知道性能。

UPDATE 2

我从呼叫者那里得到答复,说重构代码不会破坏任何内容。我们正在寻求在此方法之外重构代码。我觉得这个方法很好。谢谢亚科夫和大家...

c# filestream
2个回答
3
投票
public static Stream GetFileStream(string fileName) => File.OpenRead(fileName);

您的其余代码在很大程度上是多余的:

  • 外部try / catch会抛出现有异常,尽管它会破坏进程中的堆栈跟踪。
  • 如果文件不存在,则File.OpenRead将已经抛出FileNotFoundException。您不需要自己进行此检查,并且如果在File.ExistsFile.OpenRead的调用之间删除了文件,这样做仍然为竞争状况留出了空间。
  • 新打开的文件流将从文件的开头开始,因此不需要Seek开头。

0
投票

FileStream constructor怎么了?

请注意,文件I / O永远不会“快速”。当然,您可以以更有效的方式执行操作,但是文件I / O通常是应用程序中较慢的部分之一。


-3
投票

如上所述,文件操作是繁琐的操作,特别是当要读取的文件是大文件时。因此,使基础流程保持简单可能会帮助您解决问题。

using (Stream str = new StreamReader(fileName).BaseStream)
{
      //do whatever you want here
}

或者您甚至可以在读取流之前添加文件是否存在检查以防止错误。

© www.soinside.com 2019 - 2024. All rights reserved.