使用获取文件检查是否存在多个文件,如果存在则复制
Check if multiple files exist from using Get Files and if they do exist then copy
目前我的桌面上有 2 个文件夹 "START" 和 "END"。
开始文件夹中可能有任意数量的文件,但我需要弄清楚以下内容。
如果文件名存在于 START FOLDER 中,则检查它们是否存在于 END 文件夹中,如果它们存在,则复制存在的文件。
我已经在代码中声明了字符串,并使用了 GetFiles 来查找每个文件夹中的文件名。但是拼不出来...
var USERNAME = Environment.UserName;
string START_DIRECTORY = @"C:\Users\" + USERNAME + "\Desktop\START";
string END_FOLDER_STRING = @"C:\Users\" + USERNAME + "\Desktop\END";
string[] files = System.IO.Directory.GetFiles(START_DIRECTORY);
string[] files2 = System.IO.Directory.GetFiles(END_FOLDER_STRING);
最简单的事情:遍历START_DIRECTORY
中的每个文件并检查结束文件中是否存在对应的文件。如果是,请复制它。请注意,这不是最好的解决方案
static void Main(string[] args)
{
var USERNAME = Environment.UserName;
string START_DIRECTORY = @"C:\Users\" + USERNAME + "\Desktop\START";
string END_FOLDER_STRING = @"C:\Users\" + USERNAME + "\Desktop\END";
string[] startFiles = System.IO.Directory.GetFiles(START_DIRECTORY);
string[] endFiles = System.IO.Directory.GetFiles(END_FOLDER_STRING);
//for every file in start files
foreach (var startFile in startFiles)
{
//get its name
var startFileName = Path.GetFileName(startFile);
//and try to get a file with the same name in end file
var correspondingFineInEndFiles = endFiles.FirstOrDefault(endfile => Path.GetFileName(endfile) == startFileName);
//if the file in end file does exist
if (correspondingFineInEndFiles != null)
{
//copy it, and override the old file
File.Copy(startFile, correspondingFineInEndFiles, true);
}
}
}
尝试使用 LINQ
,因为大多数时候它比遍历两个集合更快:
首先,添加一个名为 FileNameEqualityComparer
的 class。
这个class会用来比较元素是否相同。在您的情况下,如果它们的文件名相等,则应该 return true
:
public class FileNameEqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
if (ReferenceEquals(x, y))
{
return true;
}
return x != null && y != null && Path.GetFileName(x) == Path.GetFileName(y);
}
public int GetHashCode(string obj)
{
return Path.GetFileName(obj).GetHashCode();
}
}
然后使用 IEnumerable.Intersect
和创建的 IEqualityComparer
来获取您的两个集合共享的文件:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
...
static void Main(string[] args)
{
var USERNAME = Environment.UserName;
string START_DIRECTORY = @"C:\Users\" + USERNAME + "\Desktop\START";
string END_FOLDER_STRING = @"C:\Users\" + USERNAME + "\Desktop\END";
IEnumerable<string> startFiles = Directory.GetFiles(START_DIRECTORY);
IEnumerable<string> endFiles = Directory.GetFiles(END_FOLDER_STRING);
foreach(string file in startFiles.Intersect(endFiles, new FileNameEqualityComparer()))
{
File.Copy(file, "[the path to the folder where they should be copied]");
}
}
目前我的桌面上有 2 个文件夹 "START" 和 "END"。 开始文件夹中可能有任意数量的文件,但我需要弄清楚以下内容。
如果文件名存在于 START FOLDER 中,则检查它们是否存在于 END 文件夹中,如果它们存在,则复制存在的文件。
我已经在代码中声明了字符串,并使用了 GetFiles 来查找每个文件夹中的文件名。但是拼不出来...
var USERNAME = Environment.UserName;
string START_DIRECTORY = @"C:\Users\" + USERNAME + "\Desktop\START";
string END_FOLDER_STRING = @"C:\Users\" + USERNAME + "\Desktop\END";
string[] files = System.IO.Directory.GetFiles(START_DIRECTORY);
string[] files2 = System.IO.Directory.GetFiles(END_FOLDER_STRING);
最简单的事情:遍历START_DIRECTORY
中的每个文件并检查结束文件中是否存在对应的文件。如果是,请复制它。请注意,这不是最好的解决方案
static void Main(string[] args)
{
var USERNAME = Environment.UserName;
string START_DIRECTORY = @"C:\Users\" + USERNAME + "\Desktop\START";
string END_FOLDER_STRING = @"C:\Users\" + USERNAME + "\Desktop\END";
string[] startFiles = System.IO.Directory.GetFiles(START_DIRECTORY);
string[] endFiles = System.IO.Directory.GetFiles(END_FOLDER_STRING);
//for every file in start files
foreach (var startFile in startFiles)
{
//get its name
var startFileName = Path.GetFileName(startFile);
//and try to get a file with the same name in end file
var correspondingFineInEndFiles = endFiles.FirstOrDefault(endfile => Path.GetFileName(endfile) == startFileName);
//if the file in end file does exist
if (correspondingFineInEndFiles != null)
{
//copy it, and override the old file
File.Copy(startFile, correspondingFineInEndFiles, true);
}
}
}
尝试使用 LINQ
,因为大多数时候它比遍历两个集合更快:
首先,添加一个名为 FileNameEqualityComparer
的 class。
这个class会用来比较元素是否相同。在您的情况下,如果它们的文件名相等,则应该 return true
:
public class FileNameEqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
if (ReferenceEquals(x, y))
{
return true;
}
return x != null && y != null && Path.GetFileName(x) == Path.GetFileName(y);
}
public int GetHashCode(string obj)
{
return Path.GetFileName(obj).GetHashCode();
}
}
然后使用 IEnumerable.Intersect
和创建的 IEqualityComparer
来获取您的两个集合共享的文件:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
...
static void Main(string[] args)
{
var USERNAME = Environment.UserName;
string START_DIRECTORY = @"C:\Users\" + USERNAME + "\Desktop\START";
string END_FOLDER_STRING = @"C:\Users\" + USERNAME + "\Desktop\END";
IEnumerable<string> startFiles = Directory.GetFiles(START_DIRECTORY);
IEnumerable<string> endFiles = Directory.GetFiles(END_FOLDER_STRING);
foreach(string file in startFiles.Intersect(endFiles, new FileNameEqualityComparer()))
{
File.Copy(file, "[the path to the folder where they should be copied]");
}
}