比较文件名变量和文件路径变量
Compare file name variable with file path variable
我已经创建了一些代码,可以从服务器中提取文件名列表并存储它们,我还从计算机上的目录中获取文件夹名称,我需要比较它们以确定是否有任何在本地计算机上而不在服务器上的名称。
serverlistarray 包含服务器上的文件夹列表(每个条目 1 个文件夹),本地 listarray 包含本地计算机上的目录列表,这也是每个条目 1 个文件夹。我用这个读取本地文件:
String[] localfilelistarray = System.IO.Directory.GetDirectories(/*file location*/);
我的问题出在获取目录中,它包含我无法比较的文件的完整路径。下面的代码是我尝试做的,我在 serverlistarray 中检查 locallistarray 中的文件,如果它们匹配,我将它们放入列表中。
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 但我不能这样做,因为我需要服务器操作的原始文件名和此代码的其他部分。
编辑:
服务器列表示例:
[0]folder1
[1]folder2
[2]folder3
本地文件数组示例:
[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] 的文件名(去掉扩展名的文件名),但所有文件都在列表变量中。这可以归结为换行或其中一个字符串末尾的 space 吗?由于某种原因,检查数组是否包含值的 if 语句不起作用。
从字符串的存储方式来看,最深的文件夹名称只是写成一个文件名。所以我用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())));`
我建议不要拆分“\”等,而是使用 DirectoryInfo 获取目录名称:
var directoryInfo = new DirectoryInfo(@"c:\MyDir");
String directoryName = directoryInfo.Name; // returns "MyDir"
我已经创建了一些代码,可以从服务器中提取文件名列表并存储它们,我还从计算机上的目录中获取文件夹名称,我需要比较它们以确定是否有任何在本地计算机上而不在服务器上的名称。
serverlistarray 包含服务器上的文件夹列表(每个条目 1 个文件夹),本地 listarray 包含本地计算机上的目录列表,这也是每个条目 1 个文件夹。我用这个读取本地文件:
String[] localfilelistarray = System.IO.Directory.GetDirectories(/*file location*/);
我的问题出在获取目录中,它包含我无法比较的文件的完整路径。下面的代码是我尝试做的,我在 serverlistarray 中检查 locallistarray 中的文件,如果它们匹配,我将它们放入列表中。
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 但我不能这样做,因为我需要服务器操作的原始文件名和此代码的其他部分。
编辑:
服务器列表示例:
[0]folder1
[1]folder2
[2]folder3
本地文件数组示例:
[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] 的文件名(去掉扩展名的文件名),但所有文件都在列表变量中。这可以归结为换行或其中一个字符串末尾的 space 吗?由于某种原因,检查数组是否包含值的 if 语句不起作用。
从字符串的存储方式来看,最深的文件夹名称只是写成一个文件名。所以我用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())));`
我建议不要拆分“\”等,而是使用 DirectoryInfo 获取目录名称:
var directoryInfo = new DirectoryInfo(@"c:\MyDir");
String directoryName = directoryInfo.Name; // returns "MyDir"