2013-11-07 3 views
5

Я хочу знать, как читать несколько (около 500-1000) текстовых файлов, которые расположены на сервере. До сих пор я написал код для программы, которая читает только один текстовый файл.Как читать несколько файлов с сервера на C#

Вот как я сейчас читаю один файл.

public void button1_Click(object sender, EventArgs e) 
    { 
     // Reading/Inputing column values 



     OpenFileDialog ofd = new OpenFileDialog(); 
     if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 

      string[] fileLines = File.ReadAllLines(ofd.FileName); 

Я хотел бы избавиться от диалогового окна Открытия файла, и программа автоматически читать 500-1000 текстовые файлы, в которых расположены в разъединяете.

Я думаю, что-то вдоль линий

for (int i =0; i<numFiles; i++) 
    { 
    //just use string[] fileLines =File.ReadAllLines() 
    //how would i specify the path for multiple files? 
    } 

Вопросы затем:

  1. Как бы подойти к этому?
  2. Как я могу получить количество файлов?
    (я предполагаю, что я должен был бы прочитать файл сервер, который содержит их.)
+0

Вы хотите, чтобы рекурсивно открывать папки, начиная с папки верхнего уровня, или читать все файлы, расположенные в одной центральной папке? –

+0

Есть около 10 папок, я бы хотел их рекурсивно открыть, а затем в каждой папке рекурсивно открыть текстовые файлы. В принципе, открыть папку> Пропустить все файлы. Открыть следующую папку Пропустить все файлы> продолжить до последней папки – Newuser

ответ

1

Вы можете использовать рекурсию для просмотра всех каталогов. Использование Directory.EnumerateFiles также позволяет использовать цикл foreach, поэтому вам не нужно беспокоиться о количестве файлов.

private static void ReadAllFilesStartingFromDirectory(string topLevelDirectory) 
    { 
     const string searchPattern = "*.txt"; 
     var subDirectories = Directory.EnumerateDirectories(topLevelDirectory); 
     var filesInDirectory = Directory.EnumerateFiles(topLevelDirectory, searchPattern); 

     foreach (var subDirectory in subDirectories) 
     { 
      ReadAllFilesStartingFromDirectory(subDirectory);//recursion 
     } 

     IterateFiles(filesInDirectory, topLevelDirectory); 
    } 

    private static void IterateFiles(IEnumerable<string> files, string directory) 
    { 
     foreach (var file in files) 
     { 
      Console.WriteLine("{0}", Path.Combine(directory, file));//for verification 
      try 
      { 
       string[] lines = File.ReadAllLines(file); 
       foreach (var line in lines) 
       { 
        //Console.WriteLine(line); 
       } 
      } 
      catch (IOException ex) 
      { 
       //Handle File may be in use...      
      } 
     } 
    } 

отметить также Directory.EnumerateFiles обеспечивает перегрузку, которая позволяет обеспечить шаблон поиска, чтобы сузить сферу файлов.

+0

Ваш ответ очень полезно, но мне нужно немного уточнить. 1) topLevelDirectory - Итак, это путь, где все отдельные файлы на сервере расположены правильно?Пример: \\ servername \ filedirectory 2) Когда я читаю файлы, я хочу только .txt. Как я могу это обеспечить? Я предполагаю, что topLevelDirectory вместе с некоторым предложением * .txt Thx – Newuser

+0

3) Разве не должен находиться второй цикл foreach внутри первого? @ P.Brian.Mackey – Newuser

+1

1) Да. Подумайте об этом как о поиске сверху вниз. 2). Да, как указано в последней строке ответа. Обновленный код. 3). Нет, это не обязательно. Это может не повлиять на результат в любом случае, но это гораздо менее читаемый ИМО. –

2

Вы можете использовать Directory.GetFiles(string path), чтобы получить все файлы из определенной директории. Затем вы можете использовать цикл foreach для перебора всех файлов в этом каталоге и выполнения вашей обработки.

+0

Вам придется использовать перегрузку SearchOption для GetFiles, поскольку есть несколько папок ... если вы не хотите кодировать отдельный путь для каждого из них: P – ovaltein

1

Как вы собираетесь получать ваши файлы, зависит от того, все ли они находятся в одном каталоге, если вам потребуется рекурсивно искать через каталог и все дочерние каталоги. Directory.GetFiles - это то, где вы хотите начать. Он имеет 3 перегруженных изображения here. Таким образом, вы можете попробовать что-то вроде этого:

string path = "\mypath\tosomehwere"; 
string searchPattern = "*.txt"; 
string[] MyFiles = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories); 

Затем просто пройдите через массив строк и выполните каждый файл, как обычно.

foreach (string filePath in MyFiles) 
{ 
     MyFileProcessMethod(filePath) 
} 

Path.GetFileName(filePath) возвратит имя файла индивидуального текста должны вам это нужно для ваших требований к обработке.

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