public static IProjectFolder GetSubFolders(FileSystemProject project, IProjectFolder parent, string path)
        {
            var result = new StandardProjectFolder(path);

            try
            {
                var folders = Directory.GetDirectories(path);

                if (folders.Count() > 0)
                {
                    foreach (var folder in folders.Where(f => !IsExcluded(project.ExcludedFiles, project.CurrentDirectory.MakeRelativePath(f).ToAvalonPath())))
                    {
                        result.Items.InsertSorted(GetSubFolders(project, result, folder));
                    }
                }

                PopulateFiles(project, result);

                project.Folders.InsertSorted(result);
                result.Parent  = parent;
                result.Project = project;
            }
            catch (Exception)
            {
            }

            return(result);
        }
        public static void PopulateFiles(FileSystemProject project, IProjectFolder folder)
        {
            var files = Directory.EnumerateFiles(folder.Location);

            files = files.Where(f => !IsExcluded(project.ExcludedFiles, project.CurrentDirectory.MakeRelativePath(f).ToAvalonPath()) && f != project.Location);

            foreach (var file in files)
            {
                var sourceFile = File.FromPath(project, folder, file.ToPlatformPath().NormalizePath());
                project.SourceFiles.InsertSorted(sourceFile);
                folder.Items.InsertSorted(sourceFile);
            }
        }
        public static void PopulateFiles(FileSystemProject project, IProjectFolder folder)
        {
            var files = Directory.EnumerateFiles(folder.Location);

            files = files.Where(f =>!IsExcluded(project.ExcludedFiles, project.CurrentDirectory.MakeRelativePath(f).ToAvalonPath()) && f != project.Location);

            foreach (var file in files)
            {
                var sourceFile = File.FromPath(project, folder, file.ToPlatformPath());
                project.SourceFiles.InsertSorted(sourceFile);
                folder.Items.InsertSorted(sourceFile);
            }
        }
        private void RemoveFiles(FileSystemProject project, IProjectFolder folder)
        {
            foreach (var item in folder.Items)
            {
                if (item is IProjectFolder)
                {
                    RemoveFiles(project, item as IProjectFolder);
                    project.Folders.Remove(item as IProjectFolder);
                }

                if (item is ISourceFile)
                {
                    project.SourceFiles.Remove(item as ISourceFile);
                }
            }
        }
        private void RemoveFiles(FileSystemProject project, IProjectFolder folder)
        {
            foreach (var item in folder.Items.ToList())
            {
                if (item is IProjectFolder subfolder)
                {
                    RemoveFiles(project, subfolder);
                    project.Folders.Remove(subfolder);
                }

                if (item is ISourceFile file)
                {
                    project.RemoveFile(file);
                }
            }
        }
        public static IProjectFolder GetSubFolders(FileSystemProject project, IProjectFolder parent, string path)
        {
            var result = new StandardProjectFolder(path);

            var folders = Directory.GetDirectories(path);

            if (folders.Count() > 0)
            {                
                foreach (var folder in folders.Where(f => !IsExcluded(project.ExcludedFiles, project.CurrentDirectory.MakeRelativePath(f).ToAvalonPath())))
                {
                    result.Items.InsertSorted(GetSubFolders(project, result, folder));
                }
            }

            PopulateFiles(project, result);

            project.Folders.InsertSorted(result);
            result.Parent = parent;
            result.Project = project;

            return result;
        }
        private void RemoveFiles(FileSystemProject project, IProjectFolder folder)
        {
            foreach (var item in folder.Items)
            {
                if (item is IProjectFolder)
                {
                    RemoveFiles(project, item as IProjectFolder);
                    project.Folders.Remove(item as IProjectFolder);
                }

                if (item is ISourceFile)
                {
                    project.SourceFiles.Remove(item as ISourceFile);
                }
            }
        }