Пример #1
0
        // 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) {
            }
        }