@ -9,7 +9,7 @@ namespace NzbDrone.Common.Disk
{
public interface IFileSystemLookupService
{
FileSystemResult LookupContents ( string query , bool includeFiles );
FileSystemResult LookupContents ( string query , bool includeFiles , bool allowFoldersWithoutTrailingSlashes );
}
public class FileSystemLookupService : IFileSystemLookupService
@ -51,14 +51,13 @@ namespace NzbDrone.Common.Disk
_diskProvider = diskProvider ;
}
public FileSystemResult LookupContents ( string query , bool includeFiles )
public FileSystemResult LookupContents ( string query , bool includeFiles , bool allowFoldersWithoutTrailingSlashes )
{
var result = new FileSystemResult ( ) ;
if ( query . IsNullOrWhiteSpace ( ) )
{
if ( OsInfo . IsWindows )
{
var result = new FileSystemResult ( ) ;
result . Directories = GetDrives ( ) ;
return result ;
@ -67,41 +66,23 @@ namespace NzbDrone.Common.Disk
query = "/" ;
}
if (
allowFoldersWithoutTrailingSlashes & &
query . IsPathValid ( ) & &
_diskProvider . FolderExists ( query ) )
{
return GetResult ( query , includeFiles ) ;
}
var lastSeparatorIndex = query . LastIndexOf ( Path . DirectorySeparatorChar ) ;
var path = query . Substring ( 0 , lastSeparatorIndex + 1 ) ;
if ( lastSeparatorIndex ! = - 1 )
{
try
{
result . Parent = GetParent ( path ) ;
result . Directories = GetDirectories ( path ) ;
if ( includeFiles )
{
result . Files = GetFiles ( path ) ;
}
}
catch ( DirectoryNotFoundException )
{
return new FileSystemResult { Parent = GetParent ( path ) } ;
}
catch ( ArgumentException )
{
return new FileSystemResult ( ) ;
}
catch ( IOException )
{
return new FileSystemResult { Parent = GetParent ( path ) } ;
}
catch ( UnauthorizedAccessException )
{
return new FileSystemResult { Parent = GetParent ( path ) } ;
}
return GetResult ( path , includeFiles ) ;
}
return result ;
return new FileSystemResult ( ) ;
}
private List < FileSystemModel > GetDrives ( )
@ -117,6 +98,41 @@ namespace NzbDrone.Common.Disk
. ToList ( ) ;
}
private FileSystemResult GetResult ( string path , bool includeFiles )
{
var result = new FileSystemResult ( ) ;
try
{
result . Parent = GetParent ( path ) ;
result . Directories = GetDirectories ( path ) ;
if ( includeFiles )
{
result . Files = GetFiles ( path ) ;
}
}
catch ( DirectoryNotFoundException )
{
return new FileSystemResult { Parent = GetParent ( path ) } ;
}
catch ( ArgumentException )
{
return new FileSystemResult ( ) ;
}
catch ( IOException )
{
return new FileSystemResult { Parent = GetParent ( path ) } ;
}
catch ( UnauthorizedAccessException )
{
return new FileSystemResult { Parent = GetParent ( path ) } ;
}
return result ;
}
private List < FileSystemModel > GetDirectories ( string path )
{
var directories = _diskProvider . GetDirectoryInfos ( path )