我创建了一些代码,它从服务器中提取文件名列表并存储它们,我还从计算机上的目录中获取文件夹名称,我需要比较它们以查明是否有任何名称在本地计算机上,而不是在服务器上。
serverlistarray包含服务器上的文件夹列表(每个条目1个文件夹),本地listarray包含本地计算机上的目录列表,每个条目也有1个文件夹。我用这个读了本地文件:
String[] localfilelistarray = System.IO.Directory.GetDirectories(/*file location*/);
我的问题在于get目录,它包含了我无法比较的文件的完整路径。下面的代码是我试图做的,我在locallistarray中检查serverlistarray中的文件,如果它们匹配,我将它们放在列表中。
for (int b = 0; b < localfilelistarray.Length; b++)
{
//problem with the compare
if (!serverlistarray.Contains(localfilelistarray[b].Replace(/*file path before filename*/, "")))
{
//add to list variable
}
}
然后,我使用此代码对列表中的所有内容执行我想要的操作(现在它是一个显示文件名的消息框)。
for (int f = 0; f < delete.Count(); f++)
{
MessageBox.Show(/*list variable*/);
}
但即使它在serverlistarray中,我也得到每个文件,但是我无法解决什么错误。我相信它与两个数组的比较有关,但是当我在该循环中放置消息框时,它按预期出现但是比较似乎不起作用。
有谁能看到我做错了什么?
我尝试使用替换和直接比较无济于事。我虽然将文件路径添加到serverlistarray但我不能这样做,因为我需要服务器操作的原始文件名和此代码的其他部分。
编辑:
serverlistarray示例:
[0]folder1
[1]folder2
[2]folder3
localfilearray示例:
[0]c:\\users\Noliver\folder1
[1]c:\\users\Noliver\folder2
[2]c:\\users\Noliver\folder3
[3]c:\\users\Noliver\folder4
[4]c:\\users\Noliver\folder5
预期输出(for循环中的消息框):
c:\\users\Noliver\folder4
&
c:\\users\Noliver\folder5
编辑2:
我尝试过使用文件路径时没有舔的代码:
for (int b = 0; b < localfilelistarray.Length; b++)
{
String[] temp = System.IO.Path.GetFileName(localfilelistarray[b]).Split('.');
MessageBox.Show(localfilelistarray[b] + " - " + temp[0]);
for (int t = 0; t < serverlistarray.Length;t++)
{
MessageBox.Show("server " + serverlistarray[t] + " - " + localfilelistarray[b] + " - " + temp[0]);
}
if (!update.Contains(temp[0]))
{
delete.Add(localfilelistarray[b]);
}
}
此输出显示serverlistarray包含temp [0]的文件名(扩展名取消的文件名),但所有文件都在list变量中。这可以归结为其中一根琴弦末尾的新行或空格吗?由于某种原因,if语句检查数组是否包含值无效。
答案 0 :(得分:0)
从存储字符串的方式来看,最深的文件夹名称就像它们是文件名一样。所以我使用Path.GetFileName
来提取它。
localfilearray.Where(x => !serverlistarray.Contains(Path.GetFileName(x)))
这项工作在大多数情况下也是如此,如果你不喜欢上一个的名字:
localfilearray.Where(x => !serverlistarray.Contains(x.Split('\\').Last()))
要将上述代码与现有代码一起使用,您可以:
展开现有的delete
列表,以包含要删除的内容:
delete.AddRange(localfilearray.Where(x => !serverlistarray.Contains(x.Split('\\').Last())));
或者,只需声明如下:
var delete = new List(localfilearray.Where(x => !serverlistarray.Contains(x.Split('\\').Last())));`
答案 1 :(得分:0)
我建议不要拆分“\”等,而是使用DirectoryInfo来获取目录的名称:
var directoryInfo = new DirectoryInfo(@"c:\MyDir");
String directoryName = directoryInfo.Name; // returns "MyDir"