Exemple #1
0
        public static IReadOnlyCollection <FileInfo> GetFilesRecursive(
            this DirectoryInfo directoryInfo,
            IEnumerable <string> fileExtensions             = null,
            PathLookupSpecification pathLookupSpecification = null,
            string rootDir = null)
        {
            if (directoryInfo == null)
            {
                throw new ArgumentNullException(nameof(directoryInfo));
            }

            if (!directoryInfo.Exists)
            {
                throw new DirectoryNotFoundException($"The directory '{directoryInfo.FullName}' does not exist");
            }

            PathLookupSpecification usedPathLookupSpecification =
                pathLookupSpecification ?? DefaultPaths.DefaultPathLookupSpecification;
            IEnumerable <string> usedFileExtensions = fileExtensions ?? new List <string>();

            if (usedPathLookupSpecification.IsBlackListed(directoryInfo.FullName, rootDir).Item1)
            {
                return(new List <FileInfo>());
            }

            IReadOnlyCollection <string> invalidFileExtensions = usedFileExtensions
                                                                 .Where(fileExtension => !fileExtension.StartsWith(".", StringComparison.OrdinalIgnoreCase))
                                                                 .ToReadOnlyCollection();

            if (invalidFileExtensions.Any())
            {
                throw new ArgumentException("File extensions must start with '.', eg .txt");
            }

            var files = new List <FileInfo>();

            List <FileInfo> directoryFiles = directoryInfo
                                             .GetFiles()
                                             .Where(file => !usedPathLookupSpecification.IsFileBlackListed(file.FullName, rootDir).Item1)
                                             .ToList();

            List <FileInfo> filtered = (usedFileExtensions.Any()
                    ? directoryFiles.Where(file => usedFileExtensions.Any(extension => file.Extension.Equals(
                                                                              extension,
                                                                              StringComparison.InvariantCultureIgnoreCase)))
                    : directoryFiles)
                                       .ToList();

            files.AddRange(filtered);

            DirectoryInfo[] subDirectories = directoryInfo.GetDirectories();

            files.AddRange(subDirectories
                           .SelectMany(dir => dir.GetFilesRecursive(fileExtensions, usedPathLookupSpecification, rootDir))
                           .ToList());

            return(files);
        }
Exemple #2
0
        public static async Task <ExitCode> CopyAsync(
            string sourceDir,
            string targetDir,
            ILogger optionalLogger = null,
            PathLookupSpecification pathLookupSpecificationOption = null,
            string rootDir = null)
        {
            PathLookupSpecification pathLookupSpecification =
                pathLookupSpecificationOption ?? DefaultPaths.DefaultPathLookupSpecification;

            ILogger logger = optionalLogger ?? new NullLogger();

            if (string.IsNullOrWhiteSpace(sourceDir))
            {
                throw new ArgumentNullException(nameof(sourceDir));
            }

            if (string.IsNullOrWhiteSpace(targetDir))
            {
                throw new ArgumentNullException(nameof(targetDir));
            }

            var sourceDirectory = new DirectoryInfo(sourceDir);

            if (!sourceDirectory.Exists)
            {
                throw new ArgumentException($"Source directory '{sourceDir}' does not exist");
            }

            (bool, string)isBlackListed = pathLookupSpecification.IsBlackListed(sourceDir, rootDir);
            if (isBlackListed.Item1)
            {
                logger.WriteDebug(
                    $"Directory '{sourceDir}' is blacklisted from specification {pathLookupSpecification}, {isBlackListed.Item2}");
                return(ExitCode.Success);
            }

            new DirectoryInfo(targetDir).EnsureExists();

            foreach (FileInfo file in sourceDirectory.GetFiles())
            {
                string destFileName = Path.Combine(targetDir, file.Name);

                (bool, string)isFileBlackListed = pathLookupSpecification.IsFileBlackListed(file.FullName, rootDir, logger: optionalLogger);

                if (isFileBlackListed.Item1)
                {
                    logger.WriteVerbose($"File '{file.FullName}' is blacklisted, skipping copying file, {isFileBlackListed.Item2}");
                    continue;
                }

                logger.WriteVerbose($"Copying file '{file.FullName}' to destination '{destFileName}'");

                try
                {
                    file.CopyTo(destFileName, true);
                }
                catch (PathTooLongException ex)
                {
                    logger.WriteError(
                        $"Could not copy file to '{destFileName}', path length is too long ({destFileName.Length})"
                        + " " + ex);
                    return(ExitCode.Failure);
                }
                catch (Exception ex)
                {
                    logger.WriteError(
                        $"Could not copy file '{file.FullName}' to destination '{destFileName}'" +
                        " " + ex);
                    return(ExitCode.Failure);
                }
            }

            foreach (DirectoryInfo directory in sourceDirectory.GetDirectories())
            {
                ExitCode exitCode = await CopyAsync(
                    directory.FullName,
                    Path.Combine(targetDir, directory.Name),
                    pathLookupSpecificationOption : pathLookupSpecification);

                if (!exitCode.IsSuccess)
                {
                    return(exitCode);
                }
            }

            return(ExitCode.Success);
        }