2017-01-12 6 views
-1

Я пишу программу, где есть папка с очень большим количеством файлов (более тысячи). Мне нужен эффективный способ «открыть каждый файл и обработать его». Обработка включает вызов базы данных хранимые процедуры, в зависимости от содержания file.i написали следующий код, чтобы прочитать содержимое каждого file.Please дайте мне знать, если какое-либо улучшение или альтернативные варианты.Обработка большого количества файлов C#

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(); 
     } 
    } 
} 
+7

Поскольку это рабочий код, который вы хотите обзор, вы будете иметь больше удачи над на [Обзор] Код (http://codereview.stackexchange.com) - Тем не менее, пожалуйста, потратить немного времени должным образом форматирования вашего кода и сообщения, прежде чем делать это. – Rob

+2

Да, обзор кода - лучшее место, чтобы спросить. Убедитесь, что вы включили код, который вызывает хранимую процедуру, иначе они не смогут предоставить ответ (и вопрос может быть закрыт). – Alexei

+3

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он относится к Code Review stackexchange. –

ответ

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

вы также можете использовать FileOptions.Asynchronous | FileOptions.SequentialScan при открытии FileStream. флаг SequentialScan указывает, что к файлу необходимо получить доступ последовательно от начала до конца. Система может использовать это как подсказку для оптимизации кэширования файлов.

смотри также this link

Смежные вопросы