From 95b634d48145f82887ae77c024a82fee3ecc88b0 Mon Sep 17 00:00:00 2001
From: Andy Cedilnik <andy.cedilnik@kitware.com>
Date: Fri, 11 Feb 2005 16:25:07 -0500
Subject: [PATCH] ENH: Implement copy of directory with content

---
 SystemTools.cxx    | 45 +++++++++++++++++++++++++++++++++++++++++++++
 SystemTools.hxx.in |  3 +++
 2 files changed, 48 insertions(+)

diff --git a/SystemTools.cxx b/SystemTools.cxx
index 5e4399f..6c321c9 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -1061,6 +1061,51 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
   return true;
 }
 
+/**
+ * Copy a directory content from "source" directory to the directory named by
+ * "destination".
+ */
+bool SystemTools::CopyADirectory(const char* source, const char* destination)
+{
+  Directory dir;
+  dir.Load(source);
+  size_t fileNum;
+  if ( !SystemTools::MakeDirectory(destination) )
+    {
+    return false;
+    }
+  for (fileNum = 0; fileNum <  dir.GetNumberOfFiles(); ++fileNum)
+    {
+    if (strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)),".") &&
+        strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)),".."))
+      {
+      kwsys_stl::string fullPath = source;
+      fullPath += "/";
+      fullPath += dir.GetFile(static_cast<unsigned long>(fileNum));
+      if(SystemTools::FileIsDirectory(fullPath.c_str()))
+        {
+        kwsys_stl::string fullDestPath = destination;
+        fullDestPath += "/";
+        fullDestPath += dir.GetFile(static_cast<unsigned long>(fileNum));
+        if (!SystemTools::CopyADirectory(fullPath.c_str(), fullDestPath.c_str()))
+          {
+          return false;
+          }
+        }
+      else
+        {
+        if(!SystemTools::CopyFileAlways(fullPath.c_str(), destination))
+          {
+          return false;
+          }
+        }
+      }
+    }
+
+  return true;
+}
+
+
 // return size of file; also returns zero if no file exists
 unsigned long SystemTools::FileLength(const char* filename)
 {
diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in
index 2a5a363..f5dd75c 100644
--- a/SystemTools.hxx.in
+++ b/SystemTools.hxx.in
@@ -172,6 +172,9 @@ public:
 
   ///! Copy a file.
   static bool CopyFileAlways(const char* source, const char* destination);
+
+  ///! Copy content directory to another directory with all files and subdirectories
+  static bool CopyADirectory(const char* source, const char* destination);
   
   ///! Remove a file.
   static bool RemoveFile(const char* source);
-- 
GitLab