Esempio n. 1
0
        IEnumerable <File> ScanDirectoryForFiles(File root_dir)
        {
            FileEnumerator enumerator = null;

            try {
                enumerator = root_dir.EnumerateChildren("standard::name,standard::type,standard::is-symlink", FileQueryInfoFlags.None, null);
            } catch (GException e) {
                if (!CatchErrors)
                {
                    throw e;
                }
                yield break;
            }

            while (true)
            {
                FileInfo info = null;
                try {
                    info = enumerator.NextFile();
                } catch (GException e) {
                    if (!CatchErrors)
                    {
                        throw e;
                    }
                    continue;
                }

                if (info == null)
                {
                    break;
                }

                File file = root_dir.GetChild(info.Name);

                // The code below looks like a duplication of ScanForFiles
                // (which could be invoked here instead), but doing so would
                // lead to a double type query on files (using QueryInfo).
                if (info.IsSymlink && IgnoreSymlinks)
                {
                    continue;
                }

                if (info.FileType == FileType.Regular)
                {
                    yield return(file);
                }
                else if (info.FileType == FileType.Directory && Recurse)
                {
                    foreach (var child in ScanDirectoryForFiles(file))
                    {
                        yield return(child);
                    }
                }
                info.Dispose();
            }

            enumerator.Close(null);
        }
Esempio n. 2
0
        protected override MenuList OnGetMenuItems()
        {
            // intentionally dont inherit
            MenuList list = new MenuList();

            list.SetContainerTitle(MenuListContainer.CustomOne, Catalog.GetString("Restore Files"));

            FileEnumerator enumerator = OwnedFile.EnumerateChildren("standard::type,standard::name", FileQueryInfoFlags.NofollowSymlinks, null);
            List <File>    files      = new List <File> ();

            if (enumerator != null)
            {
                FileInfo info;

                while ((info = enumerator.NextFile()) != null)
                {
                    files.Add(OwnedFile.GetChild(info.Name));
                    info.Dispose();
                }

                if (info != null)
                {
                    info.Dispose();
                }
                enumerator.Close(null);
                enumerator.Dispose();
            }

            /* FIXME
             *      - this code should work, but GetFiles() currently uses .net IO instead of GIO
             *        when this starts working, the enumeration block above can go away too
             * foreach (File _f in OwnedFile.GetFiles ().OrderByDescending (f => f.QueryInfo<string> ("trash::deletion-date")).Take (5)) {
             */
            foreach (File _f in files.OrderByDescending(f => f.QueryInfo <string> ("trash::deletion-date")).Take(5))
            {
                File     f    = _f;
                MenuItem item = new IconMenuItem(f.Basename, f.Icon(), (o, a) => RestoreFile(f));
                item.Mnemonic = null;
                list[MenuListContainer.CustomOne].Add(item);
            }

            list[MenuListContainer.CustomTwo].Add(
                new MenuItem(Catalog.GetString("_Open Trash"), Icon, (o, a) => OpenTrash()));
            list[MenuListContainer.CustomTwo].Add(
                new MenuItem(Catalog.GetString("Empty _Trash"), "gtk-clear", (o, a) => EmptyTrash(), !TrashFull));

            return(list);
        }
Esempio n. 3
0
        /// <summary>
        /// Recursive equivalent to GLib.File.Delete () when called on a directory.
        /// Functionally equivalent to GLib.File.Delete when called on files.
        /// </summary>
        /// <param name="file">
        /// A <see cref="GLib.File"/>
        /// </param>
        public static void Delete_Recurse(this GLib.File file)
        {
            FileEnumerator enumerator = null;

            try {
                enumerator = file.EnumerateChildren("standard::type,standard::name,access::can-delete", FileQueryInfoFlags.NofollowSymlinks, null);
            } catch { }

            if (enumerator == null)
            {
                return;
            }

            FileInfo info;

            while ((info = enumerator.NextFile()) != null)
            {
                File child = file.GetChild(info.Name);

                if (info.FileType == FileType.Directory)
                {
                    Delete_Recurse(child);
                }

                try {
                    if (info.GetAttributeBoolean("access::can-delete"))
                    {
                        child.Delete(null);
                    }
                } catch {
                    // if it fails to delete, not much we can do!
                }

                info.Dispose();
            }

            if (info != null)
            {
                info.Dispose();
            }
            enumerator.Close(null);
            enumerator.Dispose();
        }