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

C# 如何避免由于不同的原因使用foreach循环获取文件列表,c#,C#,下面是我要做的: 我有一个远程服务器(例如:svr01、svr02、svr03)。使用GetFileList读取目录,获取所有文件并与我的文件名匹配,然后复制到本地驱动器 如果有匹配的文件,我也会将它们添加到XML文件中 我试着做下面的事 class Program { static void Main(string[] args) { var getfiles = new fileshare.Program(); string realnam

下面是我要做的:

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

  • 如果有匹配的文件,我也会将它们添加到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); 
         }
     }
    
    即使我试图找出它是否匹配任何文件,我也会退出第一个foreach循环,生成basemeta(),然后转到下一个foreach循环来完成剩余的过程。

    使用这个

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

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

    Create方法检查文件是否存在,并在单个循环中执行所有操作。 你的陈述不太清楚你什么时候抄袭。。使用 您要复制或创建xml条目的条件

    你的对手是什么??如果要检查是否存在任何文件,请使用

    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在集合中循环(如果它有任何项)。因此,您不必关心文件的数量

    如果你想按照你的代码在每个副本上做输入,那么为什么你需要检查任何匹配等。它会在每个文件副本上创建输入

    foreach (var file in getfiles.GetFileList(realname,Location))
    {
      baseMeta();      
      // copy the file 
      getfiles.copytolocal(file.FullName);
    }
    
    试试这个:

    Create方法检查文件是否存在,并在单个循环中执行所有操作。 你的陈述不太清楚你什么时候抄袭。。使用 您要复制或创建xml条目的条件

    你的对手是什么??如果要检查是否存在任何文件,请使用

    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在集合中循环(如果它有任何项)。因此,您不必关心文件的数量

    如果你想按照你的代码在每个副本上做输入,那么为什么你需要检查任何匹配等。它会在每个文件副本上创建输入

    foreach (var file in getfiles.GetFileList(realname,Location))
    {
      baseMeta();      
      // copy the file 
      getfiles.copytolocal(file.FullName);
    }
    

    使用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;
    }
    
    private IEnumerable GetFileList(字符串模式、字符串位置)
    {
    string directory=string.Empty;
    开关(位置)
    {
    案例“SVR01”:
    目录=@“\\SVR01\Dev”;
    打破
    案例“SVR02”:
    目录=@“\\SVR02\Dev”;
    打破
    案例“SVR03”:
    目录=@“\\SVR03\Prod”);
    打破
    违约:
    抛出新ArgumentOutOfRangeException();
    }
    DirectoryInfo di=null;
    尝试
    {
    di=新目录信息(目录);
    }
    捕获(例外情况除外)
    {
    控制台写入线(例如消息);
    屈服断裂;
    }
    foreach(di.EnumerateFiles(模式)中的varfi)
    收益率fi;
    }
    
    使用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;
    }
    
    private IEnumerable GetFileList(字符串模式、字符串位置)
    {
    string directory=string.Empty;
    开关(位置)
    {
    案例“SVR01”:
    目录=@“\\SVR01\Dev”;
    打破
    案例“SVR02”:
    目录=@“\\SVR02\Dev”;
    打破
    案例“SVR03”:
    目录=@“\\SVR03\Prod”);
    打破
    违约:
    抛出新ArgumentOutOfRangeException();
    }
    DirectoryInfo di=null;
    尝试
    {
    di=新目录信息(目录);
    }
    捕获(例外情况除外)
    {
    控制台写入线(例如消息);
    屈服断裂;
    }
    foreach(di.EnumerateFiles(模式)中的varfi)
    收益率fi;
    }
    
    ,感谢您提供了出色的代码,老实说,我不明白它是如何工作的,我只是想知道您在代码中使用“模式”的地方。如果您稍加解释,我将不胜感激。我的代码示例中没有包含这些变量,因为它们应该由它们的用法暗示(在第一个代码段中),它们现在已经被添加。希望这更有意义。我正在使用您的代码从目录中获取文件,但我注意到一件事,它没有检查子目录。例如,目录路径“@”\\SVR02\Dev“,我在同一路径中有子目录,但此过程不检查子目录?有什么建议,我想改变,以检查副主任也?谢谢advance@Usher-如果要从子目录获取文件,应使用
    DirectoryInfo.EnumerateFiles的重载。非常感谢。我试图在目录信息中搜索子目录,但它引发异常。再次感谢您的启发。感谢您的精彩代码,老实说,我不明白它是如何工作的,我只是想知道您在代码中使用“模式”的地方。如果您稍加解释,我将不胜感激。我的代码示例中没有包含这些变量,因为它们的用法(在第一段代码中)应该暗示它们现在已经添加了它们。希望这更有意义。我正在使用您的代码从目录中获取文件,但我注意到一件事,它没有检查子目录。例如,目录路径“@”\\SVR02\Dev“,我在同一路径中有子目录,但此过程不检查子目录?有什么建议,我想改变,以检查副主任也?谢谢advance@Usher-如果要从子目录获取文件,应使用
    DirectoryInfo.EnumerateFiles的重载。非常感谢。我试图在目录信息中搜索子目录,但它引发异常。再次感谢你的启发。