示例#1
0
        private static IEnumerable<Serializable.TreeNode> ListFolderAsNodes(string entrypath, bool skipFiles)
        {
            //Helper function for finding out if a folder has sub elements
            Func<string, bool> hasSubElements = (p) => skipFiles ? Directory.EnumerateDirectories(p).Any() : Directory.EnumerateFileSystemEntries(p).Any();

            //Helper function for dealing with exceptions when accessing off-limits folders
            Func<string, bool> isEmptyFolder = (p) =>
            {
                try { return !hasSubElements(p); }
                catch { }
                return true;
            };

            //Helper function for dealing with exceptions when accessing off-limits folders
            Func<string, bool> canAccess = (p) =>
            {
                try { hasSubElements(p); return true; }
                catch { }
                return false;
            };

            var systemIO = Library.Utility.Utility.IsClientLinux
                ? (Duplicati.Library.Snapshots.ISystemIO)new Duplicati.Library.Snapshots.SystemIOLinux()
                : (Duplicati.Library.Snapshots.ISystemIO)new Duplicati.Library.Snapshots.SystemIOWindows();

            foreach (var s in System.IO.Directory.EnumerateFileSystemEntries(entrypath))
            {
                Serializable.TreeNode tn = null;
                try
                {
                    var attr = systemIO.GetFileAttributes(s);
                    //var isSymlink = (attr & FileAttributes.ReparsePoint) != 0;
                    var isFolder = (attr & FileAttributes.Directory) != 0;
                    var isFile = !isFolder;
                    //var isHidden = (attr & FileAttributes.Hidden) != 0;

                    var accesible = isFile || canAccess(s);
                    var isLeaf = isFile || !accesible || isEmptyFolder(s);

                    var rawid = isFolder ? Library.Utility.Utility.AppendDirSeparator(s) : s;
                    if (!skipFiles || isFolder)
                        tn = new Serializable.TreeNode()
                    {
                        id = rawid,
                        text = systemIO.PathGetFileName(s),
                        iconCls = isFolder ? (accesible ? "x-tree-icon-parent" : "x-tree-icon-locked") : "x-tree-icon-leaf",
                        leaf = isLeaf
                    };
                }
                catch
                {
                }

                if (tn != null)
                    yield return tn;
            }
        }
示例#2
0
        private static IEnumerable <Serializable.TreeNode> ListFolderAsNodes(string entrypath, bool skipFiles, bool showHidden)
        {
            //Helper function for finding out if a folder has sub elements
            Func <string, bool> hasSubElements = (p) => skipFiles?Directory.EnumerateDirectories(p).Any() : Directory.EnumerateFileSystemEntries(p).Any();

            //Helper function for dealing with exceptions when accessing off-limits folders
            Func <string, bool> isEmptyFolder = (p) =>
            {
                try { return(!hasSubElements(p)); }
                catch { }
                return(true);
            };

            //Helper function for dealing with exceptions when accessing off-limits folders
            Func <string, bool> canAccess = (p) =>
            {
                try { hasSubElements(p); return(true); }
                catch { }
                return(false);
            };

            var systemIO = Library.Utility.Utility.IsClientLinux
                ? (Duplicati.Library.Snapshots.ISystemIO) new Duplicati.Library.Snapshots.SystemIOLinux()
                : (Duplicati.Library.Snapshots.ISystemIO) new Duplicati.Library.Snapshots.SystemIOWindows();

            foreach (var s in System.IO.Directory.EnumerateFileSystemEntries(entrypath))
            {
                Serializable.TreeNode tn = null;
                try
                {
                    var attr      = systemIO.GetFileAttributes(s);
                    var isSymlink = (attr & FileAttributes.ReparsePoint) != 0;
                    var isFolder  = (attr & FileAttributes.Directory) != 0;
                    var isFile    = !isFolder;
                    var isHidden  = (attr & FileAttributes.Hidden) != 0;

                    var accesible = isFile || canAccess(s);
                    var isLeaf    = isFile || !accesible || isEmptyFolder(s);

                    var rawid = isFolder ? Library.Utility.Utility.AppendDirSeparator(s) : s;
                    if (skipFiles && !isFolder)
                    {
                        continue;
                    }

                    if (!showHidden && isHidden)
                    {
                        continue;
                    }

                    tn = new Serializable.TreeNode()
                    {
                        id      = rawid,
                        text    = systemIO.PathGetFileName(s),
                        hidden  = isHidden,
                        symlink = isSymlink,
                        iconCls = isFolder ? (accesible ? (isSymlink ? "x-tree-icon-symlink" : "x-tree-icon-parent") : "x-tree-icon-locked") : "x-tree-icon-leaf",
                        leaf    = isLeaf
                    };
                }
                catch
                {
                }

                if (tn != null)
                {
                    yield return(tn);
                }
            }
        }
示例#3
0
        private static IEnumerable <Serializable.TreeNode> ListFolderAsNodes(string entrypath, bool skipFiles, bool showHidden)
        {
            //Helper function for finding out if a folder has sub elements
            Func <string, bool> hasSubElements = (p) => skipFiles?Directory.EnumerateDirectories(p).Any() : Directory.EnumerateFileSystemEntries(p).Any();

            //Helper function for dealing with exceptions when accessing off-limits folders
            Func <string, bool> isEmptyFolder = (p) =>
            {
                try { return(!hasSubElements(p)); }
                catch { }
                return(true);
            };

            //Helper function for dealing with exceptions when accessing off-limits folders
            Func <string, bool> canAccess = (p) =>
            {
                try { hasSubElements(p); return(true); }
                catch { }
                return(false);
            };

            foreach (var s in SystemIO.IO_OS.EnumerateFileSystemEntries(entrypath)
                     // Group directories first
                     .OrderByDescending(f => SystemIO.IO_OS.GetFileAttributes(f) & FileAttributes.Directory)
                     // Sort both groups (directories and files) alphabetically
                     .ThenBy(f => f))
            {
                Serializable.TreeNode tn = null;
                try
                {
                    var attr      = SystemIO.IO_OS.GetFileAttributes(s);
                    var isSymlink = SystemIO.IO_OS.IsSymlink(s, attr);
                    var isFolder  = (attr & FileAttributes.Directory) != 0;
                    var isFile    = !isFolder;
                    var isHidden  = (attr & FileAttributes.Hidden) != 0;

                    var accessible = isFile || canAccess(s);
                    var isLeaf     = isFile || !accessible || isEmptyFolder(s);

                    var rawid = isFolder ? Util.AppendDirSeparator(s) : s;
                    if (skipFiles && !isFolder)
                    {
                        continue;
                    }

                    if (!showHidden && isHidden)
                    {
                        continue;
                    }

                    tn = new Serializable.TreeNode()
                    {
                        id      = rawid,
                        text    = SystemIO.IO_OS.PathGetFileName(s),
                        hidden  = isHidden,
                        symlink = isSymlink,
                        iconCls = isFolder ? (accessible ? (isSymlink ? "x-tree-icon-symlink" : "x-tree-icon-parent") : "x-tree-icon-locked") : "x-tree-icon-leaf",
                        leaf    = isLeaf
                    };
                }
                catch
                {
                }

                if (tn != null)
                {
                    yield return(tn);
                }
            }
        }
示例#4
0
namespace Duplicati.Server.WebServer.RESTMethods