using System; using System.Collections.Generic; using System.IO; using System.Threading; namespace SharpCifs.Util.Sharpen { public class FilePath { private string _path; private static long _tempCounter; public FilePath () { } public FilePath (string path) : this ((string) null, path) { } public FilePath (FilePath other, string child) : this ((string) other, child) { } public FilePath (string other, string child) { if (other == null) { _path = child; } else { while (!string.IsNullOrEmpty(child) && (child[0] == Path.DirectorySeparatorChar || child[0] == Path.AltDirectorySeparatorChar)) child = child.Substring (1); if (!string.IsNullOrEmpty(other) && other[other.Length - 1] == Path.VolumeSeparatorChar) other += Path.DirectorySeparatorChar; _path = Path.Combine (other, child); } } public static implicit operator FilePath (string name) { return new FilePath (name); } public static implicit operator string (FilePath filePath) { return filePath == null ? null : filePath._path; } public override bool Equals (object obj) { FilePath other = obj as FilePath; if (other == null) return false; return GetCanonicalPath () == other.GetCanonicalPath (); } public override int GetHashCode () { return _path.GetHashCode (); } public bool CreateNewFile () { try { //Stream.`Close` method deleted //File.Open (_path, FileMode.CreateNew).Close (); File.Open(_path, FileMode.CreateNew).Dispose(); return true; } catch { return false; } } public static FilePath CreateTempFile () { return new FilePath (Path.GetTempFileName ()); } public static FilePath CreateTempFile (string prefix, string suffix) { return CreateTempFile (prefix, suffix, null); } public static FilePath CreateTempFile (string prefix, string suffix, FilePath directory) { string file; if (prefix == null) { throw new ArgumentNullException ("prefix"); } if (prefix.Length < 3) { throw new ArgumentException ("prefix must have at least 3 characters"); } string str = (directory == null) ? Path.GetTempPath () : directory.GetPath (); do { file = Path.Combine (str, prefix + Interlocked.Increment (ref _tempCounter) + suffix); } while (File.Exists (file)); new FileOutputStream (file).Close (); return new FilePath (file); } public void DeleteOnExit () { } public FilePath GetAbsoluteFile () { return new FilePath (Path.GetFullPath (_path)); } public string GetAbsolutePath () { return Path.GetFullPath (_path); } public FilePath GetCanonicalFile () { return new FilePath (GetCanonicalPath ()); } public string GetCanonicalPath () { string p = Path.GetFullPath (_path); p.TrimEnd (Path.DirectorySeparatorChar); return p; } public string GetName () { return Path.GetFileName (_path); } public FilePath GetParentFile () { return new FilePath (Path.GetDirectoryName (_path)); } public string GetPath () { return _path; } public bool IsAbsolute () { return Path.IsPathRooted (_path); } public bool IsDirectory () { return false; // FileHelper.Instance.IsDirectory(this); } public bool IsFile () { return false; //FileHelper.Instance.IsFile (this); } public long LastModified () { return 0; // FileHelper.Instance.LastModified(this); } public long Length () { return 0; // FileHelper.Instance.Length(this); } public string[] List () { return List (null); } public string[] List (IFilenameFilter filter) { try { if (IsFile ()) return null; List list = new List (); foreach (string filePth in Directory.GetFileSystemEntries (_path)) { string fileName = Path.GetFileName (filePth); if ((filter == null) || filter.Accept (this, fileName)) { list.Add (fileName); } } return list.ToArray (); } catch { return null; } } public FilePath[] ListFiles () { try { if (IsFile ()) return null; List list = new List (); foreach (string filePath in Directory.GetFileSystemEntries (_path)) { list.Add (new FilePath (filePath)); } return list.ToArray (); } catch { return null; } } static void MakeDirWritable (string dir) { //FileHelper.Instance.MakeDirWritable (dir); } static void MakeFileWritable (string file) { //FileHelper.Instance.MakeFileWritable (file); } public bool Mkdir () { try { if (Directory.Exists (_path)) return false; Directory.CreateDirectory (_path); return true; } catch (Exception) { return false; } } public bool Mkdirs () { try { if (Directory.Exists (_path)) return false; Directory.CreateDirectory (_path); return true; } catch { return false; } } public bool RenameTo (FilePath file) { return RenameTo (file._path); } public bool RenameTo (string name) { return false; // FileHelper.Instance.RenameTo(this, name); } public bool SetLastModified (long milis) { return false; // FileHelper.Instance.SetLastModified(this, milis); } public bool SetReadOnly () { return false; // FileHelper.Instance.SetReadOnly(this); } public Uri ToUri () { return new Uri (_path); } // Don't change the case of this method, since ngit does reflection on it public bool CanExecute () { return false; // FileHelper.Instance.CanExecute(this); } // Don't change the case of this method, since ngit does reflection on it public bool SetExecutable (bool exec) { return false; // FileHelper.Instance.SetExecutable(this, exec); } public string GetParent () { string p = Path.GetDirectoryName (_path); if (string.IsNullOrEmpty(p) || p == _path) return null; return p; } public override string ToString () { return _path; } static internal string PathSeparator { get { return Path.PathSeparator.ToString (); } } static internal char PathSeparatorChar { get { return Path.PathSeparator; } } static internal char SeparatorChar { get { return Path.DirectorySeparatorChar; } } static internal string Separator { get { return Path.DirectorySeparatorChar.ToString (); } } } }