将文件名变量与文件路径变量进行比较

时间:2015-01-13 14:29:18

标签: c# winforms

我创建了一些代码,它从服务器中提取文件名列表并存储它们,我还从计算机上的目录中获取文件夹名称,我需要比较它们以查明是否有任何名称在本地计算机上,而不是在服务器上。

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语句检查数组是否包含值无效。

2 个答案:

答案 0 :(得分:0)

从存储字符串的方式来看,最深的文件夹名称就像它们是文件名一样。所以我使用Path.GetFileName来提取它。

localfilearray.Where(x => !serverlistarray.Contains(Path.GetFileName(x)))

这项工作在大多数情况下也是如此,如果你不喜欢上一个的名字:

localfilearray.Where(x => !serverlistarray.Contains(x.Split('\\').Last()))

要将上述代码与现有代码一起使用,您可以:

  1. 展开现有的delete列表,以包含要删除的内容:

    delete.AddRange(localfilearray.Where(x => !serverlistarray.Contains(x.Split('\\').Last())));
    
  2. 或者,只需声明如下:

    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"