// Needs performance improvements private void CreateEntriesFromFileSystem(DirectoryInfo dir, IEnumerable <FileTypes> filter, bool recurse = false) { try { // Get all entries IEnumerable <FileSystemInfo> fsEntries = dir.GetFileSystemInfos(); // Create filtering hashset HashSet <string> filterExtensions = FileExtension.GetFsExtensionFilter(filter?.ToArray()); using (var ctx = new MediaContext()) { // Find a possible parent entry for the current dir string currentParentId = FileSystemItem.GenerateId(dir.Parent.FullName); // Create the currently scanned dir as object var currentDirObj = ctx.Items.Add(FileSystemItem.CreateFromFileSystemInfo(dir)) as DirectoryItem; // if we have a current parent, add it if (ctx.Items.FirstOrDefault(e => e.Id == currentParentId) is DirectoryItem currentDirParent) { currentDirObj.Parents.Add(currentDirParent); } IEnumerable <FileSystemInfo> fsFileEntries = fsEntries.Where(e => !File.GetAttributes(e.FullName).HasFlag(FileAttributes.Directory) && (!filterExtensions.Any() || filterExtensions.Contains(e.Extension))); if (fsFileEntries.Any()) { foreach (var fsFileEntry in fsFileEntries) { FileSystemItem currentEntryObj = ctx.Items.Add( FileSystemItem.CreateFromFileSystemInfo(fsFileEntry)); currentEntryObj.Parents.Add(currentDirObj); currentDirObj.Children.Add(currentEntryObj); } } ctx.SaveChanges(); } // Recurse sub-dirs if (recurse) { foreach (var fsDir in fsEntries.Where(e => File.GetAttributes(e.FullName).HasFlag(FileAttributes.Directory))) { CreateEntriesFromFileSystem(new DirectoryInfo(fsDir.FullName), filter, recurse); } } } catch (Exception ex) { } }