4 Commits 47176d98e1 ... 03a32df57e

Author SHA1 Message Date
  Piotr Czajkowski 03a32df57e A bit of future 2 years ago
  Piotr Czajkowski e4955c55af Don't let it blow 2 years ago
  Piotr Czajkowski d6eaed1f6d Keep it consistent 2 years ago
  Piotr Czajkowski d9007cb2af Should work better 2 years ago

+ 72 - 23
ProcessFiles/ProcessFiles.cs

@@ -5,30 +5,41 @@ using System.Linq;
 
 namespace ProcessFiles
 {
+    public enum Result
+    {
+        File,
+        Directory,
+        Failure
+    }
+
     public static class ProcessFiles
     {
         private static List<string> _errors;
-        private static void ProcessDir(string path, string fileExtension, Action<string> callback, bool recursive = false)
+
+        private static Result WhatIsIt(string argument)
         {
-            var searchOption = SearchOption.TopDirectoryOnly;
-            if (recursive)
-                searchOption = SearchOption.AllDirectories;
+            try
+            {
+                var attr = File.GetAttributes(argument);
+                if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
+                    return Result.Directory;
 
-            var files = Directory.GetFiles(path, $"*.{fileExtension}", searchOption);
-            if (!files.Any())
+                return Result.File;
+            }
+            catch (Exception e)
             {
-                _errors.Add($"There are no {fileExtension} files in {path}!");
-                return;
+                _errors.Add(e.ToString());
+                return Result.Failure;
             }
-
-            foreach (var file in files)
-                callback(file);
         }
 
-        private static bool CheckForFile(string argument, string fileExtension, Action<string> callback)
+        private static bool IsValid(string argument, string fileExtension)
         {
-            if (!File.Exists(argument))
+            if (string.IsNullOrWhiteSpace(argument) || !File.Exists(argument))
+            {
+                _errors.Add($"{argument} doesn't exist!");
                 return false;
+            }
 
             var extension = Path.GetExtension(argument);
             if (string.IsNullOrWhiteSpace(extension))
@@ -37,32 +48,70 @@ namespace ProcessFiles
                 return false;
             }
 
-            if (!extension.Equals($".{fileExtension}"))
+            if (!extension.TrimStart('.').Equals(fileExtension, StringComparison.InvariantCultureIgnoreCase))
             {
                 _errors.Add($"Extension of {argument} doesn't match {fileExtension}!");
                 return false;
             }
 
-            callback(argument);
             return true;
         }
 
+        private static void ProcessFile(string path, string fileExtension, Action<string> callback)
+        {
+            if (!IsValid(path, fileExtension))
+                return;
+
+            try
+            {
+                callback(path);
+            }
+            catch (Exception e)
+            {
+                _errors.Add(e.ToString());
+            }
+        }
+
+        private static void ProcessDir(string path, string fileExtension, Action<string> callback, bool recursive = false)
+        {
+            if (!Directory.Exists(path))
+            {
+                _errors.Add($"{path} doesn't exist!");
+                return;
+            }
+
+            var searchOption = SearchOption.TopDirectoryOnly;
+            if (recursive)
+                searchOption = SearchOption.AllDirectories;
+
+            var files = Directory.GetFiles(path, $"*.{fileExtension}", searchOption);
+            if (!files.Any())
+            {
+                _errors.Add($"There are no {fileExtension} files in {path}!");
+                return;
+            }
+
+            foreach (var file in files)
+                ProcessFile(file, fileExtension, callback);
+        }
+
         public static IEnumerable<string> Process(IEnumerable<string> arguments, string fileExtension, Action<string> callback, bool recursive = false)
         {
             _errors = new List<string>();
 
             foreach (var argument in arguments)
             {
-                if (CheckForFile(argument, fileExtension, callback))
-                    continue;
-
-                if (!Directory.Exists(argument))
+                switch (WhatIsIt(argument))
                 {
-                    _errors.Add($"{argument} is neither file nor directory!");
-                    continue;
+                    case Result.File:
+                        ProcessFile(argument, fileExtension, callback);
+                        break;
+                    case Result.Directory:
+                        ProcessDir(argument, fileExtension, callback, recursive);
+                        break;
+                    case Result.Failure:
+                        continue;
                 }
-
-                ProcessDir(argument, fileExtension, callback, recursive);
             }
 
             return _errors;

+ 1 - 1
ProcessFiles/ProcessFiles.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>netcoreapp3.0;net472</TargetFrameworks>
+    <TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>
   </PropertyGroup>
 
 </Project>

+ 1 - 1
ProcessFilesTests/ProcessFilesTests.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp3.0</TargetFramework>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
 
     <IsPackable>false</IsPackable>
   </PropertyGroup>