using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
namespace MediaBrowser.Common.IO
{
    /// 
    /// Interface IFileSystem
    /// 
    public interface IFileSystem
    {
        /// 
        /// Determines whether the specified filename is shortcut.
        /// 
        /// The filename.
        /// true if the specified filename is shortcut; otherwise, false.
        bool IsShortcut(string filename);
        /// 
        /// Resolves the shortcut.
        /// 
        /// The filename.
        /// System.String.
        string ResolveShortcut(string filename);
        /// 
        /// Creates the shortcut.
        /// 
        /// The shortcut path.
        /// The target.
        void CreateShortcut(string shortcutPath, string target);
        /// 
        /// Gets the file system info.
        /// 
        /// The path.
        /// FileSystemInfo.
        FileSystemInfo GetFileSystemInfo(string path);
        /// 
        /// Gets the valid filename.
        /// 
        /// The filename.
        /// System.String.
        string GetValidFilename(string filename);
        /// 
        /// Gets the creation time UTC.
        /// 
        /// The info.
        /// DateTime.
        DateTime GetCreationTimeUtc(FileSystemInfo info);
        /// 
        /// Gets the last write time UTC.
        /// 
        /// The information.
        /// DateTime.
        DateTime GetLastWriteTimeUtc(FileSystemInfo info);
        /// 
        /// Gets the last write time UTC.
        /// 
        /// The path.
        /// DateTime.
        DateTime GetLastWriteTimeUtc(string path);
        /// 
        /// Gets the file stream.
        /// 
        /// The path.
        /// The mode.
        /// The access.
        /// The share.
        /// if set to true [is asynchronous].
        /// FileStream.
        Stream GetFileStream(string path, FileMode mode, FileAccess access, FileShare share, bool isAsync = false);
		Stream OpenRead(String path);
        /// 
        /// Swaps the files.
        /// 
        /// The file1.
        /// The file2.
        void SwapFiles(string file1, string file2);
        /// 
        /// Determines whether [contains sub path] [the specified parent path].
        /// 
        /// The parent path.
        /// The path.
        /// true if [contains sub path] [the specified parent path]; otherwise, false.
        bool ContainsSubPath(string parentPath, string path);
        /// 
        /// Determines whether [is root path] [the specified path].
        /// 
        /// The path.
        /// true if [is root path] [the specified path]; otherwise, false.
        bool IsRootPath(string path);
        /// 
        /// Normalizes the path.
        /// 
        /// The path.
        /// System.String.
        string NormalizePath(string path);
        /// 
        /// Substitutes the path.
        /// 
        /// The path.
        /// From.
        /// To.
        /// System.String.
        string SubstitutePath(string path, string from, string to);
        /// 
        /// Gets the file name without extension.
        /// 
        /// The information.
        /// System.String.
        string GetFileNameWithoutExtension(FileSystemInfo info);
        /// 
        /// Gets the file name without extension.
        /// 
        /// The path.
        /// System.String.
        string GetFileNameWithoutExtension(string path);
        /// 
        /// Determines whether [is path file] [the specified path].
        /// 
        /// The path.
        /// true if [is path file] [the specified path]; otherwise, false.
        bool IsPathFile(string path);
        /// 
        /// Deletes the file.
        /// 
        /// The path.
        void DeleteFile(string path);
        /// 
        /// Deletes the directory.
        /// 
        /// The path.
        /// if set to true [recursive].
        void DeleteDirectory(string path, bool recursive);
        
        IEnumerable GetDirectories(string path, bool recursive = false);
		IEnumerable GetFiles(string path, bool recursive = false);
		IEnumerable GetFileSystemEntries(string path, bool recursive = false);
		void CreateDirectory(string path);
		void CopyFile(string source, string target, bool overwrite);
		void MoveFile(string source, string target);
		void MoveDirectory(string source, string target);
		bool DirectoryExists(string path);
		bool FileExists(string path);
		string ReadAllText(string path);
        void WriteAllText(string path, string text);
        
        void WriteAllText(string path, string text, Encoding encoding);
        string ReadAllText(string path, Encoding encoding);
        IEnumerable GetDirectoryPaths(string path, bool recursive = false);
        IEnumerable GetFilePaths(string path, bool recursive = false);
        IEnumerable GetFileSystemEntryPaths(string path, bool recursive = false);
    }
}