[PATCH 21/41] robocopy: add move source folder switch (/MOVE)

Florian Eder others.meder at gmail.com
Mon Sep 6 09:54:58 CDT 2021


Implements the /MOVE switch, which moves not only the files,
but also the directories in the source folder

Signed-off-by: Florian Eder <others.meder at gmail.com>
---
 programs/robocopy/main.c     | 31 ++++++++++++++++++++++++++++---
 programs/robocopy/robocopy.h |  1 +
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/programs/robocopy/main.c b/programs/robocopy/main.c
index 3036776339d..1cfbe65e94b 100644
--- a/programs/robocopy/main.c
+++ b/programs/robocopy/main.c
@@ -177,6 +177,12 @@ static void parse_arguments(int argc, WCHAR *argv[])
             {
                 options.purge_source_files = TRUE;
             }
+            /* move - Delete files (including folders) after copying them */
+            else if (!wcsicmp(argv[i], L"/move"))
+            {
+                options.purge_source = TRUE;
+                options.purge_source_files = TRUE;
+            }
             /* lev - Limit depth of subdirectories */
             else if (!wcsnicmp(argv[i], L"/lev:", 5))
             {
@@ -388,6 +394,19 @@ static BOOL perform_copy(struct robocopy_statistics *statistics)
 
     }
 
+    /* if move is specified, we delete the empty remaining folders in the source */
+    if (options.purge_source)
+    {
+        LIST_FOR_EACH_ENTRY_REV(current_path, &paths_source, struct path, entry)
+        {
+            /* append relative path to the source to get the absolute path of the source file / directory */
+            current_absolute_path = get_combined_path(options.source, current_path->name);
+
+            if (PathIsDirectoryEmptyW(current_absolute_path))
+                RemoveDirectoryW(current_absolute_path);
+        }
+    }
+
     /* search for extra files (files only in destination) to be able to return the correct exit code */
     LIST_FOR_EACH_ENTRY_REV(current_path, &paths_destination, struct path, entry)
     {
@@ -459,9 +478,15 @@ static WCHAR *get_option_string(void)
     if (options.purge_destination)
         wcscat(temp_string, L"/PURGE ");
 
-    /* Move files */
-    if (options.purge_source_files)
-        wcscat(temp_string, L"/MOV ");
+    /* Move files and folders */
+    if (options.purge_source)
+        wcscat(temp_string, L"/MOVE ");
+    else
+    {
+        /* Move files */
+        if (options.purge_source_files)
+            wcscat(temp_string, L"/MOV ");
+    }
 
     string = wcsdup(temp_string);
     return string;
diff --git a/programs/robocopy/robocopy.h b/programs/robocopy/robocopy.h
index e6779248aa5..aa58240d8cc 100644
--- a/programs/robocopy/robocopy.h
+++ b/programs/robocopy/robocopy.h
@@ -40,6 +40,7 @@ struct robocopy_options {
     BOOL copy_subdirectories;
     BOOL copy_empty_subdirectories;
     BOOL purge_source_files;
+    BOOL purge_source;
     BOOL purge_destination;
     BOOL mirror;
 };
-- 
2.32.0




More information about the wine-devel mailing list