c# - 在 C# 中仅复制新的或修改的文件/目录
问题描述
我正在尝试在 C# 中创建一个简单的“目录/文件复制”控制台应用程序。我需要将所有文件夹和文件(保持原始层次结构)从一个驱动器复制到另一个驱动器,例如从驱动器 C:\Data 到驱动器 E :\数据。
但是,我只希望它将任何 NEW 或 MODIFIED 文件从源复制到目标。如果目标驱动器上的文件比源驱动器上的文件新,则不会复制。
(问题)
在我拥有的代码中,它将源中的文件“abc.pdf”与目标中的文件“xyz.pdf”进行比较,因此即使目标文件较新,也会用源中的任何内容覆盖目标文件。我试图弄清楚如何将源中的“abc.pdf”与目标中的“abc.pdf”进行比较。
如果我将源和目标向下钻取到特定文件,则此方法有效,但是当我返回到文件夹级别时,即使目标文件较新,它也会用源文件覆盖目标文件。
(我的解决方案——没用)
我认为通过将“if (file.LastWriteTime > destination.LastWriteTime)”放在“foreach”命令之后,它会比较两个文件夹中的文件,File1 源文件与 File1 目标文件,但事实并非如此。
似乎我在“FileInfo[]”、“foreach”或“if”语句中遗漏了一些东西,以便进行一对一的比较。我想可能是对“Path.Combine”语句或“SearchOption.AllDirectories”的一些引用,但我不确定。
有什么建议么?
正如您从我的基本代码示例中看到的那样,我是 C# 新手,所以请用简单的语言回答您的问题。
谢谢你。
这是我尝试过的代码,但它不起作用。
class Copy
{
public static void CopyDirectory(DirectoryInfo source, DirectoryInfo destination)
{
if (!destination.Exists)
{
destination.Create();
}
// Copy files.
FileInfo[] files = source.GetFiles();
FileInfo[] destFiles = destination.GetFiles();
foreach (FileInfo file in files)
foreach (FileInfo fileD in destFiles)
// Copy only modified files
if (file.LastWriteTime > fileD.LastWriteTime)
{
file.CopyTo(Path.Combine(destination.FullName,
file.Name), true);
}
// Copy all new files
else
if (!fileD.Exists)
{
file.CopyTo(Path.Combine(destination.FullName, file.Name), true);
}
// Process subdirectories.
DirectoryInfo[] dirs = source.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
// Get destination directory.
string destinationDir = Path.Combine(destination.FullName, dir.Name);
// Call CopyDirectory() recursively.
CopyDirectory(dir, new DirectoryInfo(destinationDir));
}
}
}
解决方案
您可以只获取“源”中的文件数组并检查“目标”中的匹配名称
/// <summary>
/// checks whether the target file needs an update (if it doesn't exist: it needs one)
/// </summary>
public static bool NeedsUpdate(FileInfo localFile, DirectoryInfo localDir, DirectoryInfo backUpDir)
{
bool needsUpdate = false;
if (!File.Exists(Path.Combine(backUpDir.FullName, localFile.Name)))
{
needsUpdate = true;
}
else
{
FileInfo backUpFile = new FileInfo(Path.Combine(backUpDir.FullName, localFile.Name));
DateTime lastBackUp = backUpFile.LastWriteTimeUtc;
DateTime lastChange = localFile.LastWriteTimeUtc;
if (lastChange != lastBackUp)
{
needsUpdate = true;
}
else
{/*no change*/}
}
return needsUpdate;
}
推荐阅读
- c# - 从 JSON 数据中的特定字段中删除单引号字符
- rust - 互斥体可以尊重结构但不能尊重原语
- excel - 如何根据其他单元格的范围向单元格输入值
- vim - 退出后避免 vim 吃掉输入
- javascript - 通过 axios 请求时,Laravel 如何自动添加 X-XSRF-TOKEN?
- html - 使用 *ngSwitchCase 时不显示列表
- android - 我如何绘制这些自定义形状?
- c++ - 无法将 IOKit 驱动程序链接到 IOHIDFamily:“依赖项加载失败”
- javascript - 从另一个文件调用函数并在完成后获取结果?
- ansible - 在ansible中打印远程运行的实时脚本输出