我用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
我从呼叫者那里得到答复,说重构代码不会破坏任何内容。我们正在寻求在此方法之外重构代码。我觉得这个方法很好。谢谢亚科夫和大家...
public static Stream GetFileStream(string fileName) => File.OpenRead(fileName);
您的其余代码在很大程度上是多余的:
try
/ catch
会抛出现有异常,尽管它会破坏进程中的堆栈跟踪。File.OpenRead
将已经抛出FileNotFoundException
。您不需要自己进行此检查,并且如果在File.Exists
和File.OpenRead
的调用之间删除了文件,这样做仍然为竞争状况留出了空间。Seek
开头。FileStream
constructor怎么了?
请注意,文件I / O永远不会“快速”。当然,您可以以更有效的方式执行操作,但是文件I / O通常是应用程序中较慢的部分之一。
如上所述,文件操作是繁琐的操作,特别是当要读取的文件是大文件时。因此,使基础流程保持简单可能会帮助您解决问题。
using (Stream str = new StreamReader(fileName).BaseStream)
{
//do whatever you want here
}
或者您甚至可以在读取流之前添加文件是否存在检查以防止错误。