将文件转换为流的最快方法

Fastest way to convert File to Stream

我做了 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 的性能。

提前致谢。

更新 1

按照下面的朋友,我把我的方法转换成下面的样子

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

我会让你知道性能。

更新 2

我收到来电者的回复说重构代码不会破坏任何东西。我们正在寻求重构此方法之外的代码。我觉得这个方法不错。谢谢 yaakov 和大家...

FileStreamconstructor有什么问题?

请注意,文件 I/O 永远不会是 "fast"。当然,您可以以更高效的方式做事,但是文件 I/O 通常是应用程序中速度较慢的部分之一。

public static Stream GetFileStream(string fileName) => File.OpenRead(fileName);

您的其余代码基本上是多余的:

  • 外部 try/catch 重新抛出现有异常,尽管它破坏了进程中的堆栈跟踪。
  • 如果文件不存在,File.OpenRead 将抛出 FileNotFoundException。你不需要自己做这个检查,如果文件在调用 File.ExistsFile.OpenRead.
  • 之间被删除,那么无论如何这样做都会为竞争条件留出空间
  • 新打开的文件流会从文件的开头开始,所以不需要Seek到开头。