我正在编写一个程序,其中有一个文件夹包含大量文件(超过数千个)。我想要一种有效的方法来“打开每个文件并处理它。处理包括根据内容调用数据库存储过程我编写了以下代码来阅读每个文件的内容。如果有任何改进或备选方案,请告诉我。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Security;
using System.Threading;
using System.Threading.Tasks;
using System.Text;
using System.Collections;
class Program
{
static void Main()
{
ProcessRead().Wait();
Console.Write("Done ");
Console.ReadKey();
}
static async Task ProcessRead()
{
var sw = Stopwatch.StartNew();
string folder = @"Directory";
string[] fileEntries = Directory.GetFiles(folder);
int count = 0;
foreach (string fname in fileEntries)
{
if (File.Exists(fname) == false)
{
Console.WriteLine("file not found: " + fname);
}
else
{
try
{
count++;
string text = await ReadTextAsync(fname);
Console.WriteLine(text);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
Console.WriteLine("Elapsed Time" + sw.ElapsedMilliseconds);
Console.WriteLine(count);
}
static async Task<string> ReadTextAsync(string filePath)
{
using (FileStream sourceStream = new FileStream(filePath,
FileMode.Open, FileAccess.Read, FileShare.Read,
bufferSize: 4096, useAsync: true))
{
StringBuilder sb = new StringBuilder();
byte[] buffer = new byte[0x1000];
int numRead;
while ((numRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
string text = Encoding.UTF8.GetString(buffer, 0, numRead);
sb.Append(text);
}
return sb.ToString();
}
}
}
答案 0 :(得分:0)
这可能取决于许多参数,例如文件大小......但您可以尝试使用以下代码避免StringBuilder
附加,并检查它是否具有更好的性能:
byte[] data;
int n;
using (FileStream sourceStream = File.Open(filename, FileMode.Open))
{
n = (int)sourceStream.Length;
data = new byte[n];
await sourceStream.ReadAsync(result, 0, n);
}
return Encoding.UTF8.GetString(data, 0, n);
打开FileStream时也可以使用FileOptions.Asynchronous | FileOptions.SequentialScan
。 SequentialScan标志表示从头到尾依次访问该文件。系统可以使用它作为优化文件缓存的提示。