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
GetFileList
读取目录,获取所有文件并与我的文件名匹配,然后复制到本地驱动器 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的重载。非常感谢。我试图在目录信息中搜索子目录,但它引发异常。再次感谢你的启发。