[PATCH 16/41] robocopy: add statistics

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


Saves and displays the number of files / directories copied or moved

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

diff --git a/programs/robocopy/main.c b/programs/robocopy/main.c
index b9356b4d104..3bd8b784796 100644
--- a/programs/robocopy/main.c
+++ b/programs/robocopy/main.c
@@ -321,7 +321,7 @@ static void get_file_paths_in_folder(WCHAR *directory_path, struct list *paths,
     }
 }
 
-static BOOL perform_copy(void)
+static BOOL perform_copy(struct robocopy_statistics *statistics)
 {
     struct list paths_source;
     struct path *current_path;
@@ -358,12 +358,14 @@ static BOOL perform_copy(void)
             /* Create the directory path and then create the directory itself */
             if (!create_directory_path(target_path))
                 output_error(STRING_ERROR_WRITE_DIRECTORY, GetLastError(), strip_path_prefix(target_path));
+            else statistics->copied_directories++;
         }
         else
         {
             if (copy_or_move_file(current_absolute_path, target_path, options.purge_source_files))
             {
                 output_message(options.purge_source_files ? STRING_MOVE_FILE : STRING_CREATE_FILE, strip_path_prefix(target_path));
+                statistics->copied_files++;
             }
         }
 
@@ -425,6 +427,10 @@ static void print_header(void)
 
 int __cdecl wmain(int argc, WCHAR *argv[])
 {
+    struct robocopy_statistics statistics;
+    int exit_code;
+    WCHAR dirs_copied[64], files_copied[64];
+
     parse_arguments(argc, argv);
 
     /* If no file filters are set, set *.* to include all files */
@@ -444,8 +450,15 @@ int __cdecl wmain(int argc, WCHAR *argv[])
         return ROBOCOPY_ERROR_NO_FILES_COPIED;
     }
 
-    if (!perform_copy())
+    memset(&statistics, 0, sizeof(struct robocopy_statistics));
+    if (!perform_copy(&statistics))
         return ROBOCOPY_ERROR_NO_FILES_COPIED;
 
-    return ROBOCOPY_NO_ERROR_FILES_COPIED;
+    swprintf(dirs_copied, ARRAY_SIZE(dirs_copied), L"%u", statistics.copied_directories);
+    swprintf(files_copied, ARRAY_SIZE(files_copied), L"%u", statistics.copied_files);
+    output_message(STRING_STATISTICS, dirs_copied, files_copied);
+
+    exit_code = ROBOCOPY_NO_ERROR_NO_COPY;
+    if (statistics.copied_files) exit_code += ROBOCOPY_NO_ERROR_FILES_COPIED;
+    return exit_code;
 }
\ No newline at end of file
diff --git a/programs/robocopy/robocopy.h b/programs/robocopy/robocopy.h
index b7f5c3db89c..6beac9dbc64 100644
--- a/programs/robocopy/robocopy.h
+++ b/programs/robocopy/robocopy.h
@@ -42,7 +42,13 @@ struct robocopy_options {
     BOOL purge_source_files;
 };
 
+struct robocopy_statistics {
+    UINT copied_directories;
+    UINT copied_files;
+};
+
 /* Exit codes */
+#define ROBOCOPY_NO_ERROR_NO_COPY             0
 #define ROBOCOPY_NO_ERROR_FILES_COPIED        1
 #define ROBOCOPY_ERROR_NO_FILES_COPIED        16
 
@@ -57,6 +63,7 @@ struct robocopy_options {
 #define STRING_ERROR_READ_DIRECTORY           1011
 #define STRING_ERROR_WRITE_DIRECTORY          1012
 #define STRING_ERROR_WRITE_FILE               1014
+#define STRING_STATISTICS                     1018
 #define STRING_CREATE_DIRECTORY               1019
 #define STRING_CREATE_FILE                    1022
 #define STRING_MOVE_FILE                      1024
\ No newline at end of file
diff --git a/programs/robocopy/robocopy.rc b/programs/robocopy/robocopy.rc
index b4a6f8ab218..b12501017e2 100644
--- a/programs/robocopy/robocopy.rc
+++ b/programs/robocopy/robocopy.rc
@@ -35,6 +35,7 @@ STRINGTABLE
     STRING_ERROR_READ_DIRECTORY, "[%1] Error %2 (%3) occurred reading directory \"%4\":\n%5\n"
     STRING_ERROR_WRITE_DIRECTORY, "[%1] Error %2 (%3) occurred writing directory \"%4\":\n%5\n"
     STRING_ERROR_WRITE_FILE, "[%1] Error %2 (%3) occurred writing file \"%4\":\n%5\n"
+    STRING_STATISTICS, "\n Copied %1 directories and %2 files\n"
     STRING_CREATE_DIRECTORY, " Created Dir: %1\n"
     STRING_CREATE_FILE, " Copied File: %1\n"
     STRING_MOVE_FILE, "  Moved File: %1\n"
-- 
2.32.0




More information about the wine-devel mailing list