From 59118d428bb4305d384bd96498244aecb5cf6755 Mon Sep 17 00:00:00 2001
From: Niko Ehrenfeuchter <nikolaus.ehrenfeuchter@unibas.ch>
Date: Fri, 15 Sep 2017 20:18:50 +0200
Subject: [PATCH] Auto-create user directories in incoming.

If a directory in C:\Users\ has a matching one in the target location,
make sure the corresponding one exists in the incoming directory.

Fixes #10.
---
 AutoTx/AutoTx.cs | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/AutoTx/AutoTx.cs b/AutoTx/AutoTx.cs
index 4539298..7bdbfd5 100644
--- a/AutoTx/AutoTx.cs
+++ b/AutoTx/AutoTx.cs
@@ -21,10 +21,16 @@ namespace AutoTx
         private string _statusPath;
         private string _incomingPath;
         private string _managedPath;
+
+        private string[] _remoteUserDirs;
+        private string[] _localUserDirs;
+
         private List<string> _transferredFiles = new List<string>();
 
         private int _txProgress;
 
+        private DateTime _lastUserDirCheck = DateTime.Now;
+
         // the transfer state:
         private enum TxState
         {
@@ -60,6 +66,7 @@ namespace AutoTx
             InitializeComponent();
             CreateEventLog();
             LoadSettings();
+            CreateIncomingDirectories();
         }
 
         /// <summary>
@@ -410,6 +417,10 @@ namespace AutoTx
             CheckFreeDiskSpace();
             UpdateServiceState();
 
+            var delta = DateTime.Now - _lastUserDirCheck;
+            if (delta.Seconds >= 10)
+                CreateIncomingDirectories();
+
             // tasks depending on the service state:
             if (_serviceSuspended) {
                 // make sure to pause any running transfer:
@@ -852,6 +863,35 @@ namespace AutoTx
             return retval;
         }
 
+        /// <summary>
+        /// Helper to create directories for all users that have one in the local
+        /// user directory (C:\Users) AND in the DestinationDirectory.
+        /// </summary>
+        private void CreateIncomingDirectories() {
+            _localUserDirs = new DirectoryInfo(@"C:\Users")
+                .GetDirectories()
+                .Select(d => d.Name)
+                .ToArray();
+            _remoteUserDirs = new DirectoryInfo(_config.DestinationDirectory)
+                .GetDirectories()
+                .Select(d => d.Name)
+                .ToArray();
+
+            foreach (var userDir in _localUserDirs) {
+                // don't create an incoming directory for the same name as the
+                // temporary transfer location:
+                if (_config.TmpTransferDir == userDir)
+                    continue;
+
+                // don't create a directory if it doesn't exist on the target:
+                if (!_remoteUserDirs.Contains(userDir))
+                    continue;
+
+                CreateNewDirectory(Path.Combine(_incomingPath, userDir), false);
+            }
+            _lastUserDirCheck = DateTime.Now;
+        }
+
         #endregion
 
     }
-- 
GitLab