public static void ActAfterPublish(Webresource resource, Settings settings)
        {
            if (settings.AfterPublishCommand.Contains("{FilePath}") && string.IsNullOrEmpty(resource.FilePath))
            {
                throw new Exception("It is required that the web resource has a file path in its properties to use a command referencing the tag {FilePath}");
            }

            RunCommand(settings.AfterPublishCommand.Replace("{FilePath}", resource.FilePath));
        }
        private static void LoadFilesFromFolder(MyPluginControl parent, Settings settings, List <string> extensionsToLoad, List <string> invalidFilenames,
                                                DirectoryInfo di, string rootPath, List <Webresource> list, int organizationMajorVersion)
        {
            if (di.FullName != rootPath)
            {
                foreach (var diChild in di.GetDirectories())
                {
                    LoadFilesFromFolder(parent, settings, extensionsToLoad, invalidFilenames, diChild, rootPath, list, organizationMajorVersion);
                }
            }

            var fileInfos          = di.GetFiles("*", SearchOption.TopDirectoryOnly);
            var files              = new HashSet <string>(fileInfos.Select(f => f.FullName));
            var extensionlessFiles = new HashSet <string>();
            var ignoredLocalFiles  = new List <string>();

            ignoredLocalFiles.AddRange(settings.IgnoredLocalFiles);
            ignoredLocalFiles.AddRange(settings.IgnoredLocalFiles.Select(f => f.Replace("\\", "/")));
            foreach (var fi in fileInfos.Where(f => extensionsToLoad.Contains(f.Extension)))
            {
                var relativePath = GetRelativePath(rootPath, fi.FullName);

                if (ignoredLocalFiles.Contains(relativePath, StringComparer.CurrentCultureIgnoreCase) ||
                    ignoredLocalFiles.Contains(fi.FullName, StringComparer.CurrentCultureIgnoreCase))
                {
                    // File is set to be ignored, ignore it.
                    continue;
                }

                if (fi.Extension.Length == 0 ||
                    !IsNameValid(fi.Name, organizationMajorVersion) ||
                    !extensionsToLoad.Contains(fi.Extension))
                {
                    invalidFilenames.Add(fi.FullName);
                    continue;
                }

                var resource = new Webresource(relativePath, fi.FullName,
                                               GetTypeFromExtension(fi.Extension.Remove(0, 1)), parent, settings);
                var extensionless = Path.Combine(fi.DirectoryName ?? "", Path.GetFileNameWithoutExtension(fi.FullName));
                if (files.Contains(extensionless))
                {
                    resource.ExtensionlessMappingFilePath = extensionless;
                    extensionlessFiles.Add(extensionless);
                }

                if (parent.WebresourcesCache.All(r => !string.Equals(r.Name, resource.Name, StringComparison.CurrentCultureIgnoreCase)))
                {
                    parent.WebresourcesCache.Add(resource);
                }

                list.Add(resource);
            }

            invalidFilenames.RemoveAll(f => extensionlessFiles.Contains(f));
        }