using System; using System.Collections.Generic; using System.IO; using System.Linq; using NzbDrone.Common.Disk; namespace NzbDrone.Api.Directories { public interface IDirectoryLookupService { List LookupSubDirectories(string query); } public class DirectoryLookupService : IDirectoryLookupService { private readonly IDiskProvider _diskProvider; private readonly HashSet _setToRemove = new HashSet { "$Recycle.Bin", "System Volume Information" }; public DirectoryLookupService(IDiskProvider diskProvider) { _diskProvider = diskProvider; } public List LookupSubDirectories(string query) { var dirs = new List(); var lastSeparatorIndex = query.LastIndexOf(Path.DirectorySeparatorChar); var path = query.Substring(0, lastSeparatorIndex + 1); if (lastSeparatorIndex != -1) { dirs = GetSubDirectories(path); dirs.RemoveAll(x => _setToRemove.Contains(new DirectoryInfo(x).Name)); } return dirs; } private List GetSubDirectories(string path) { try { return _diskProvider.GetDirectories(path).ToList(); } catch (DirectoryNotFoundException) { return new List(); } catch (ArgumentException) { return new List(); } catch (IOException) { return new List(); } } } }