如何避免使用foreach循环获取文件列表的原因不同

时间:2012-03-06 04:11:42

标签: c#

这是我想做的事情:

  1. 我有一个远程服务器(例如:svr01,svr02,svr03)。使用GetFileList读取目录获取所有文件并与我拥有的文件名匹配,然后复制到我的本地驱动器。

  2. 如果有任何文件匹配,那么我们也将它们添加到XML文件中。

  3. 我试图像下面这样做

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

    即使我试图找出它是否匹配任何文件然后我退出第一个foreach循环生成 basemeta()然后转到下一个foreach循环来完成剩余的过程。

3 个答案:

答案 0 :(得分:2)

使用此

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

答案 1 :(得分: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;
}

答案 2 :(得分: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);
}