@ -50,7 +50,7 @@ namespace Emby.Server.Implementations.IO
_isEnvironmentCaseInsensitive = environmentInfo . OperatingSystem = = MediaBrowser . Model . System . OperatingSystem . Windows ;
}
public string DefaultDirectory
public virtual string DefaultDirectory
{
get
{
@ -60,7 +60,7 @@ namespace Emby.Server.Implementations.IO
{
try
{
if ( Directory Exists( value ) )
if ( Directory . Exists( value ) )
{
return value ;
}
@ -75,7 +75,7 @@ namespace Emby.Server.Implementations.IO
}
}
public v oid AddShortcutHandler ( IShortcutHandler handler )
public v irtual v oid AddShortcutHandler ( IShortcutHandler handler )
{
_shortcutHandlers . Add ( handler ) ;
}
@ -94,13 +94,6 @@ namespace Emby.Server.Implementations.IO
}
}
public char DirectorySeparatorChar = > Path . DirectorySeparatorChar ;
public string GetFullPath ( string path )
{
return Path . GetFullPath ( path ) ;
}
/// <summary>
/// Determines whether the specified filename is shortcut.
/// </summary>
@ -142,7 +135,7 @@ namespace Emby.Server.Implementations.IO
return null ;
}
public string MakeAbsolutePath ( string folderPath , string filePath )
public virtual string MakeAbsolutePath ( string folderPath , string filePath )
{
if ( string . IsNullOrWhiteSpace ( filePath ) ) return filePath ;
@ -195,7 +188,7 @@ namespace Emby.Server.Implementations.IO
/// or
/// target
/// </exception>
public v oid CreateShortcut ( string shortcutPath , string target )
public v irtual v oid CreateShortcut ( string shortcutPath , string target )
{
if ( string . IsNullOrEmpty ( shortcutPath ) )
{
@ -227,7 +220,7 @@ namespace Emby.Server.Implementations.IO
/// <returns>A <see cref="FileSystemMetadata"/> object.</returns>
/// <remarks>If the specified path points to a directory, the returned <see cref="FileSystemMetadata"/> object's
/// <see cref="FileSystemMetadata.IsDirectory"/> property will be set to true and all other properties will reflect the properties of the directory.</remarks>
public FileSystemMetadata GetFileSystemInfo ( string path )
public virtual FileSystemMetadata GetFileSystemInfo ( string path )
{
// Take a guess to try and avoid two file system hits, but we'll double-check by calling Exists
if ( Path . HasExtension ( path ) )
@ -262,7 +255,7 @@ namespace Emby.Server.Implementations.IO
/// <remarks><para>If the specified path points to a directory, the returned <see cref="FileSystemMetadata"/> object's
/// <see cref="FileSystemMetadata.IsDirectory"/> property and the <see cref="FileSystemMetadata.Exists"/> property will both be set to false.</para>
/// <para>For automatic handling of files <b>and</b> directories, use <see cref="GetFileSystemInfo"/>.</para></remarks>
public FileSystemMetadata GetFileInfo ( string path )
public virtual FileSystemMetadata GetFileInfo ( string path )
{
var fileInfo = new FileInfo ( path ) ;
@ -277,7 +270,7 @@ namespace Emby.Server.Implementations.IO
/// <remarks><para>If the specified path points to a file, the returned <see cref="FileSystemMetadata"/> object's
/// <see cref="FileSystemMetadata.IsDirectory"/> property will be set to true and the <see cref="FileSystemMetadata.Exists"/> property will be set to false.</para>
/// <para>For automatic handling of files <b>and</b> directories, use <see cref="GetFileSystemInfo"/>.</para></remarks>
public FileSystemMetadata GetDirectoryInfo ( string path )
public virtual FileSystemMetadata GetDirectoryInfo ( string path )
{
var fileInfo = new DirectoryInfo ( path ) ;
@ -339,24 +332,19 @@ namespace Emby.Server.Implementations.IO
return result ;
}
/// <summary>
/// The space char
/// </summary>
private const char SpaceChar = ' ' ;
/// <summary>
/// Takes a filename and removes invalid characters
/// </summary>
/// <param name="filename">The filename.</param>
/// <returns>System.String.</returns>
/// <exception cref="ArgumentNullException">filename</exception>
public string GetValidFilename ( string filename )
public virtual string GetValidFilename ( string filename )
{
var builder = new StringBuilder ( filename ) ;
foreach ( var c in _invalidFileNameChars )
{
builder = builder . Replace ( c , SpaceChar ) ;
builder = builder . Replace ( c , ' ' ) ;
}
return builder . ToString ( ) ;
@ -386,17 +374,17 @@ namespace Emby.Server.Implementations.IO
/// </summary>
/// <param name="path">The path.</param>
/// <returns>DateTime.</returns>
public DateTime GetCreationTimeUtc ( string path )
public virtual DateTime GetCreationTimeUtc ( string path )
{
return GetCreationTimeUtc ( GetFileSystemInfo ( path ) ) ;
}
public DateTime GetCreationTimeUtc ( FileSystemMetadata info )
public virtual DateTime GetCreationTimeUtc ( FileSystemMetadata info )
{
return info . CreationTimeUtc ;
}
public DateTime GetLastWriteTimeUtc ( FileSystemMetadata info )
public virtual DateTime GetLastWriteTimeUtc ( FileSystemMetadata info )
{
return info . LastWriteTimeUtc ;
}
@ -425,7 +413,7 @@ namespace Emby.Server.Implementations.IO
/// </summary>
/// <param name="path">The path.</param>
/// <returns>DateTime.</returns>
public DateTime GetLastWriteTimeUtc ( string path )
public virtual DateTime GetLastWriteTimeUtc ( string path )
{
return GetLastWriteTimeUtc ( GetFileSystemInfo ( path ) ) ;
}
@ -439,7 +427,7 @@ namespace Emby.Server.Implementations.IO
/// <param name="share">The share.</param>
/// <param name="isAsync">if set to <c>true</c> [is asynchronous].</param>
/// <returns>FileStream.</returns>
public Stream GetFileStream ( string path , FileOpenMode mode , FileAccessMode access , FileShareMode share , bool isAsync = false )
public virtual Stream GetFileStream ( string path , FileOpenMode mode , FileAccessMode access , FileShareMode share , bool isAsync = false )
{
if ( _supportsAsyncFileStreams & & isAsync )
{
@ -449,7 +437,7 @@ namespace Emby.Server.Implementations.IO
return GetFileStream ( path , mode , access , share , FileOpenOptions . None ) ;
}
public Stream GetFileStream ( string path , FileOpenMode mode , FileAccessMode access , FileShareMode share , FileOpenOptions fileOpenOptions )
public virtual Stream GetFileStream ( string path , FileOpenMode mode , FileAccessMode access , FileShareMode share , FileOpenOptions fileOpenOptions )
= > new FileStream ( path , GetFileMode ( mode ) , GetFileAccess ( access ) , GetFileShare ( share ) , 4096 , GetFileOptions ( fileOpenOptions ) ) ;
private static FileOptions GetFileOptions ( FileOpenOptions mode )
@ -511,7 +499,7 @@ namespace Emby.Server.Implementations.IO
}
}
public v oid SetHidden ( string path , bool isHidden )
public v irtual v oid SetHidden ( string path , bool isHidden )
{
if ( _environmentInfo . OperatingSystem ! = MediaBrowser . Model . System . OperatingSystem . Windows )
{
@ -535,7 +523,7 @@ namespace Emby.Server.Implementations.IO
}
}
public v oid SetReadOnly ( string path , bool isReadOnly )
public v irtual v oid SetReadOnly ( string path , bool isReadOnly )
{
if ( _environmentInfo . OperatingSystem ! = MediaBrowser . Model . System . OperatingSystem . Windows )
{
@ -559,7 +547,7 @@ namespace Emby.Server.Implementations.IO
}
}
public v oid SetAttributes ( string path , bool isHidden , bool isReadOnly )
public v irtual v oid SetAttributes ( string path , bool isHidden , bool isReadOnly )
{
if ( _environmentInfo . OperatingSystem ! = MediaBrowser . Model . System . OperatingSystem . Windows )
{
@ -611,7 +599,7 @@ namespace Emby.Server.Implementations.IO
/// </summary>
/// <param name="file1">The file1.</param>
/// <param name="file2">The file2.</param>
public v oid SwapFiles ( string file1 , string file2 )
public v irtual v oid SwapFiles ( string file1 , string file2 )
{
if ( string . IsNullOrEmpty ( file1 ) )
{
@ -630,18 +618,13 @@ namespace Emby.Server.Implementations.IO
SetHidden ( file2 , false ) ;
Directory . CreateDirectory ( _tempPath ) ;
CopyFile ( file1 , temp1 , true ) ;
File. Copy( file1 , temp1 , true ) ;
CopyFile ( file2 , file1 , true ) ;
CopyFile ( temp1 , file2 , true ) ;
File. Copy( file2 , file1 , true ) ;
File. Copy( temp1 , file2 , true ) ;
}
private static char GetDirectorySeparatorChar ( string path )
{
return Path . DirectorySeparatorChar ;
}
public bool ContainsSubPath ( string parentPath , string path )
public virtual bool ContainsSubPath ( string parentPath , string path )
{
if ( string . IsNullOrEmpty ( parentPath ) )
{
@ -653,19 +636,19 @@ namespace Emby.Server.Implementations.IO
throw new ArgumentNullException ( nameof ( path ) ) ;
}
var separatorChar = GetDirectorySeparatorChar( parentPath ) ;
var separatorChar = Path. DirectorySeparatorChar ;
return path . IndexOf ( parentPath . TrimEnd ( separatorChar ) + separatorChar , StringComparison . OrdinalIgnoreCase ) ! = - 1 ;
}
public bool IsRootPath ( string path )
public virtual bool IsRootPath ( string path )
{
if ( string . IsNullOrEmpty ( path ) )
{
throw new ArgumentNullException ( nameof ( path ) ) ;
}
var parent = GetDirectoryName( path ) ;
var parent = Path. GetDirectoryName( path ) ;
if ( ! string . IsNullOrEmpty ( parent ) )
{
@ -675,12 +658,7 @@ namespace Emby.Server.Implementations.IO
return true ;
}
public string GetDirectoryName ( string path )
{
return Path . GetDirectoryName ( path ) ;
}
public string NormalizePath ( string path )
public virtual string NormalizePath ( string path )
{
if ( string . IsNullOrEmpty ( path ) )
{
@ -692,10 +670,10 @@ namespace Emby.Server.Implementations.IO
return path ;
}
return path . TrimEnd ( GetDirectorySeparatorChar( path ) ) ;
return path . TrimEnd ( Path. DirectorySeparatorChar ) ;
}
public bool AreEqual ( string path1 , string path2 )
public virtual bool AreEqual ( string path1 , string path2 )
{
if ( path1 = = null & & path2 = = null )
{
@ -710,7 +688,7 @@ namespace Emby.Server.Implementations.IO
return string . Equals ( NormalizePath ( path1 ) , NormalizePath ( path2 ) , StringComparison . OrdinalIgnoreCase ) ;
}
public string GetFileNameWithoutExtension ( FileSystemMetadata info )
public virtual string GetFileNameWithoutExtension ( FileSystemMetadata info )
{
if ( info . IsDirectory )
{
@ -720,12 +698,7 @@ namespace Emby.Server.Implementations.IO
return Path . GetFileNameWithoutExtension ( info . FullName ) ;
}
public string GetFileNameWithoutExtension ( string path )
{
return Path . GetFileNameWithoutExtension ( path ) ;
}
public bool IsPathFile ( string path )
public virtual bool IsPathFile ( string path )
{
// Cannot use Path.IsPathRooted because it returns false under mono when using windows-based paths, e.g. C:\\
@ -740,23 +713,13 @@ namespace Emby.Server.Implementations.IO
//return Path.IsPathRooted(path);
}
public v oid DeleteFile ( string path )
public v irtual v oid DeleteFile ( string path )
{
SetAttributes ( path , false , false ) ;
File . Delete ( path ) ;
}
public void DeleteDirectory ( string path , bool recursive )
{
Directory . Delete ( path , recursive ) ;
}
public void CreateDirectory ( string path )
{
Directory . CreateDirectory ( path ) ;
}
public List < FileSystemMetadata > GetDrives ( )
public virtual List < FileSystemMetadata > GetDrives ( )
{
// Only include drives in the ready state or this method could end up being very slow, waiting for drives to timeout
return DriveInfo . GetDrives ( ) . Where ( d = > d . IsReady ) . Select ( d = > new FileSystemMetadata
@ -768,19 +731,19 @@ namespace Emby.Server.Implementations.IO
} ) . ToList ( ) ;
}
public IEnumerable < FileSystemMetadata > GetDirectories ( string path , bool recursive = false )
public virtual IEnumerable < FileSystemMetadata > GetDirectories ( string path , bool recursive = false )
{
var searchOption = recursive ? SearchOption . AllDirectories : SearchOption . TopDirectoryOnly ;
return ToMetadata ( new DirectoryInfo ( path ) . EnumerateDirectories ( "*" , searchOption ) ) ;
}
public IEnumerable < FileSystemMetadata > GetFiles ( string path , bool recursive = false )
public virtual IEnumerable < FileSystemMetadata > GetFiles ( string path , bool recursive = false )
{
return GetFiles ( path , null , false , recursive ) ;
}
public IEnumerable < FileSystemMetadata > GetFiles ( string path , string [ ] extensions , bool enableCaseSensitiveExtensions , bool recursive = false )
public virtual IEnumerable < FileSystemMetadata > GetFiles ( string path , string [ ] extensions , bool enableCaseSensitiveExtensions , bool recursive = false )
{
var searchOption = recursive ? SearchOption . AllDirectories : SearchOption . TopDirectoryOnly ;
@ -809,7 +772,7 @@ namespace Emby.Server.Implementations.IO
return ToMetadata ( files ) ;
}
public IEnumerable < FileSystemMetadata > GetFileSystemEntries ( string path , bool recursive = false )
public virtual IEnumerable < FileSystemMetadata > GetFileSystemEntries ( string path , bool recursive = false )
{
var directoryInfo = new DirectoryInfo ( path ) ;
var searchOption = recursive ? SearchOption . AllDirectories : SearchOption . TopDirectoryOnly ;
@ -827,89 +790,19 @@ namespace Emby.Server.Implementations.IO
{
return infos . Select ( GetFileSystemMetadata ) ;
}
public string [ ] ReadAllLines ( string path )
{
return File . ReadAllLines ( path ) ;
}
public void WriteAllLines ( string path , IEnumerable < string > lines )
{
File . WriteAllLines ( path , lines ) ;
}
public Stream OpenRead ( string path )
{
return File . OpenRead ( path ) ;
}
public void CopyFile ( string source , string target , bool overwrite )
{
File . Copy ( source , target , overwrite ) ;
}
public void MoveFile ( string source , string target )
{
File . Move ( source , target ) ;
}
public void MoveDirectory ( string source , string target )
{
Directory . Move ( source , target ) ;
}
public bool DirectoryExists ( string path )
{
return Directory . Exists ( path ) ;
}
public bool FileExists ( string path )
{
return File . Exists ( path ) ;
}
public string ReadAllText ( string path )
{
return File . ReadAllText ( path ) ;
}
public byte [ ] ReadAllBytes ( string path )
{
return File . ReadAllBytes ( path ) ;
}
public void WriteAllText ( string path , string text , Encoding encoding )
{
File . WriteAllText ( path , text , encoding ) ;
}
public void WriteAllText ( string path , string text )
{
File . WriteAllText ( path , text ) ;
}
public void WriteAllBytes ( string path , byte [ ] bytes )
{
File . WriteAllBytes ( path , bytes ) ;
}
public string ReadAllText ( string path , Encoding encoding )
{
return File . ReadAllText ( path , encoding ) ;
}
public IEnumerable < string > GetDirectoryPaths ( string path , bool recursive = false )
public virtual IEnumerable < string > GetDirectoryPaths ( string path , bool recursive = false )
{
var searchOption = recursive ? SearchOption . AllDirectories : SearchOption . TopDirectoryOnly ;
return Directory . EnumerateDirectories ( path , "*" , searchOption ) ;
}
public IEnumerable < string > GetFilePaths ( string path , bool recursive = false )
public virtual IEnumerable < string > GetFilePaths ( string path , bool recursive = false )
{
return GetFilePaths ( path , null , false , recursive ) ;
}
public IEnumerable < string > GetFilePaths ( string path , string [ ] extensions , bool enableCaseSensitiveExtensions , bool recursive = false )
public virtual IEnumerable < string > GetFilePaths ( string path , string [ ] extensions , bool enableCaseSensitiveExtensions , bool recursive = false )
{
var searchOption = recursive ? SearchOption . AllDirectories : SearchOption . TopDirectoryOnly ;
@ -938,7 +831,7 @@ namespace Emby.Server.Implementations.IO
return files ;
}
public IEnumerable < string > GetFileSystemEntryPaths ( string path , bool recursive = false )
public virtual IEnumerable < string > GetFileSystemEntryPaths ( string path , bool recursive = false )
{
var searchOption = recursive ? SearchOption . AllDirectories : SearchOption . TopDirectoryOnly ;
return Directory . EnumerateFileSystemEntries ( path , "*" , searchOption ) ;
@ -948,7 +841,7 @@ namespace Emby.Server.Implementations.IO
{
if ( _environmentInfo . OperatingSystem = = MediaBrowser . Model . System . OperatingSystem . OSX )
{
RunProcess ( "chmod" , "+x \"" + path + "\"" , GetDirectoryName( path ) ) ;
RunProcess ( "chmod" , "+x \"" + path + "\"" , Path. GetDirectoryName( path ) ) ;
}
}