2012-03-06 1 views
0

Вот то, что я пытаюсь сделать:Как избежать использования цикла Еогеаспа, чтобы получить список файлов по другой причине

  1. У меня есть удаленный сервер (например: Svr01, svr02, svr03). Используя GetFileList, чтобы прочитать каталог, получите все файлы и сопоставьте с именем файла, которое у меня есть, затем скопируйте его на локальный диск.

  2. Если какие-либо файлы совпадают, я также добавляю их в файл XML.

Я пытался сделать как ниже

class Program 
{ 
    static void Main(string[] args) 
    { 
     var getfiles = new fileshare.Program(); 

     string realname = "*main*"; 
     string Location = "SVR01"; 
     bool anymatch = false; 
     foreach (var file in getfiles.GetFileList(realname,Location)) 
     {anymatch=true;} 
     if (anymatch == true) 
     { baseMeta(); } 
     foreach (var file in getfiles.GetFileList(realname,Location)) 
     {getfiles.copytolocal(file.FullName); } 

     } 

    private FileInfo[] GetFileList(string pattern,string Location) 
    { 

     try 
     { 
      switch (Location) 
      { 
       case "SVR01": 
        { 
         var di = new DirectoryInfo(@"\\SVR01\Dev"); 
         return di.GetFiles(pattern); 
        } 
       case "SVR02": 
        { 
         var di = new DirectoryInfo(@"\\SVR02\Dev"); 
         return di.GetFiles(pattern); 
        } 
       case "SVR03": 
        { 
         var di = new DirectoryInfo(@"\\SVR03\Prod"); 
         return di.GetFiles(pattern); 
        } 
       default: throw new ArgumentOutOfRangeException(); 

      } 
     } 
     catch(Exception ex) 
     { Console.Write(ex.ToString()); 
     return null; 
     } 

    } 
    private void copytolocal(string filename) 
    { 
     string nameonly = Path.GetFileName(filename); 
     File.Copy(filename,Path.Combine(@"c:\",nameonly),true); 

    } 

    private void baseMeta() 
    { 

       XmlWriter xmlWrite = XmlWriter.Create(@"c:\basexml"); 
       xmlWrite.WriteStartElement("job"); 
       xmlWrite.WriteElementString("Name", "test"); 
       xmlWrite.WriteElementString("time", DateTime); 
       xmlWrite.Close(); 

    } 
} 

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

foreach (var file in getfiles.GetFileList(realname,Location)) 
{ 
    anymatch=true;} 
    if (anymatch == true) 
    { 
      baseMeta(); 
    } 
    foreach (var file in getfiles.GetFileList(realname,Location)) 
    { 
     getfiles.copytolocal(file.FullName); 
    } 
} 

Даже пытается выяснить, если это соответствует anyfile тогда я выйти из первого цикла Еогеаспа генерировать basemeta() затем переходит к следующей итерации Еогеаспа сделать остальную часть процесса.

ответ

2

Использование LINQ, вы должны иметь возможность легко изменить код размещен в:

var getfiles = new fileshare.Program(); 
string realname = "*main*"; 
string Location = "SVR01"; 
var fileList = getFiles.GetFileList(realname, Location); 
var anymatch = fileList.Any(); 

if (anymatch) // Or possibly `if (fileList.Any())` if anymatch isn't 
       // really used anywhere else 
    baseMeta(); 

foreach (var file in getfiles.GetFileList(realname,Location)) 
    getfiles.copytolocal(file.FullName); 

Вы получите наибольшую выгоду, заменив ваш метод GetFileList с:

private IEnumerable<FileInfo> GetFileList(string pattern,string Location) 
{ 
    string directory = string.Empty; 

    switch (Location) 
    { 
     case "SVR01": 
      directory = @"\\SVR01\Dev"; 
     break; 

     case "SVR02": 
      directory = @"\\SVR02\Dev"; 
     break; 

     case "SVR03": 
      directory = @"\\SVR03\Prod"); 
     break; 

     default: 
      throw new ArgumentOutOfRangeException(); 

    } 

    DirectoryInfo di = null; 
    try 
    { 
     di = new DirectoryInfo(directory); 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
     yield break; 
    } 

    foreach(var fi in di.EnumerateFiles(pattern)) 
     yield return fi; 
} 
+0

, спасибо за отличный код, честно говоря, я не мог понять, как это работает, просто интересно, где вы используете «шаблон» в коде. Очень ценю, если вы объясните немного. – Usher

+0

Я не включал эти переменные в свой пример кода, потому что они должны были подразумеваться в их использовании (в первом фрагменте), которые они добавили сейчас. Надеюсь, это имеет смысл. –

+0

, Perfect ... Спасибо тонну – Usher

2

Используйте этот

var files = getfiles.GetFileList(realname, Location); 
if (files.Length > 0) 
{ 
    baseMeta(); 
    foreach(var file in files) 
    { 
     getfiles.copytolocal(file.FullName); 
    } 
} 
+0

, спасибо вы так много. – Usher

0

Попробуйте это:

Создать метод, чтобы проверить существование файла и сделать все в одном цикле. ваше утверждение не очень ясно, что, когда вы будете копировать или нет .. использовать ваше состояние, на котором вы хотите скопировать или создать запись XML ..

Что вы AnyMatch ?? Если вы хотите проверить, что Есть ли какой-либо файл, то используйте

var fileList = getfiles.GetFileList(realname,Location); 

    if(fileList.Count() > 0) 
    { 
    baseMeta();  
    } 
    foreach (var file in fileList) 
    { 

     // copy the file if match does not exist.. 
     getfiles.copytolocal(file.FullName); 
    } 

Но цикл Foreach путем сбора, если есть какие-либо предмет. поэтому вам не нужно заботиться о количестве файлов.

Если вы хотите сделать запись на каждой копии в соответствии с вашим кодом, то зачем вам нужно проверять anyMatch и т. д. Она создаст запись для каждой копии файла.

foreach (var file in getfiles.GetFileList(realname,Location)) 
{ 
    baseMeta();  
    // copy the file 
    getfiles.copytolocal(file.FullName); 
} 
Смежные вопросы