Пример #1
0
        /// <summary>Initializes a new instance of the <see cref="ShellLibrary"/> class.</summary>
        /// <param name="libraryName">Name of the library.</param>
        /// <param name="kf">The known folder identifier.</param>
        /// <param name="overwrite">if set to <c>true</c> [overwrite].</param>
        public ShellLibrary2(string libraryName, KNOWNFOLDERID kf = KNOWNFOLDERID.FOLDERID_Libraries, bool overwrite = false)
        {
            lib  = new IShellLibrary();
            name = libraryName;
            var item = lib.SaveInKnownFolder(kf.Guid(), libraryName, overwrite ? LIBRARYSAVEFLAGS.LSF_OVERRIDEEXISTING : LIBRARYSAVEFLAGS.LSF_FAILIFTHERE);

            Init(item);
        }
        private static void AssertSingleFolderOutput(KNOWNFOLDERID expectedId, Collection <PSObject> output)
        {
            Assert.IsNotNull(output);
            Assert.AreEqual(1, output.Count);
            var psObj = output.First();

            Assert.IsNotNull(psObj);
            Assert.IsInstanceOfType(psObj.BaseObject, typeof(KnownFolder));
            Assert.AreEqual(expectedId.value, ((KnownFolder)psObj.BaseObject).FolderId);
        }
Пример #3
0
        private void RedirectOneFolder(KnownFolder folder, string newPath)
        {
            if (!folder.CanRedirect)
            {
                throw new InvalidOperationException(string.Format("Folder '{0}' cannot be redirected.", folder.Name));
            }

            string currentPath = folder.Path;

            if (!this.ShouldProcess(folder.Name, string.Format("Redirect from {0} to {1}", currentPath, newPath)))
            {
                return;
            }

            if (!this.Force && !this.ShouldContinue("Do it?", "Folder redirection", ref this.yesToAll, ref this.noToAll))
            {
                return;
            }

            var id    = new KNOWNFOLDERID(folder.FolderId);
            var flags = KF_REDIRECT_FLAGS.KF_REDIRECT_NONE;

            if (this.CheckOnly)
            {
                flags |= KF_REDIRECT_FLAGS.KF_REDIRECT_CHECK_ONLY;
            }

            if (!this.DontMoveExistingData)
            {
                flags |= KF_REDIRECT_FLAGS.KF_REDIRECT_COPY_CONTENTS | KF_REDIRECT_FLAGS.KF_REDIRECT_DEL_SOURCE_CONTENTS;
            }

            string  error;
            HResult hr = this.knownFolderManager.Redirect(ref id, IntPtr.Zero, flags, newPath, 0, null, out error);

            if (hr != HResult.S_OK)
            {
                if (string.IsNullOrEmpty(error))
                {
                    Marshal.ThrowExceptionForHR(unchecked ((int)hr));
                    this.WriteWarning(string.Format("Redirection returned success code other than S_OK ({0})", hr));
                }
                else
                {
                    throw new TargetInvocationException(
                              error,
                              Marshal.GetExceptionForHR(unchecked ((int)hr)));
                }
            }

            if (this.PassThru)
            {
                this.WriteObject(folder);
            }
        }
Пример #4
0
        /// <inheritdoc />
        public override String ToString()
        {
            StringBuilder builder = new StringBuilder();

            builder.Append(base.ToString());
            builder.AppendFormat("DisplayName: {0}", KNOWNFOLDERID.GetDisplayName(KnownFolderID));
            builder.AppendLine();
            builder.AppendFormat("KnownFolderID: {0}", KnownFolderID);
            builder.AppendLine();
            builder.AppendFormat("Offset: {0} (0x{0:X})", Offset);
            builder.AppendLine();
            return(builder.ToString());
        }
        private IKnownFolder GetKnownFolderById(KNOWNFOLDERID knownFolderId)
        {
            IKnownFolder nativeKnownFolder;

            try
            {
                this.knownFolderManager.GetFolder(ref knownFolderId, out nativeKnownFolder);
            }
            catch (FileNotFoundException x)
            {
                throw new FileNotFoundException(string.Format("Known folder not found: {0}", knownFolderId.value), x);
            }

            return(nativeKnownFolder);
        }
Пример #6
0
 /// <summary>Initializes a new instance of the <see cref="ShellItem"/> class.</summary>
 /// <param name="knownFolder">A known folder reference.</param>
 protected ShellItem(KNOWNFOLDERID knownFolder)
 {
     if (IsMin7)
     {
         SHGetKnownFolderItem(knownFolder.Guid(), KNOWN_FOLDER_FLAG.KF_FLAG_DEFAULT, SafeTokenHandle.Null, typeof(IShellItem).GUID, out var ppv).ThrowIfFailed();
         Init((IShellItem)ppv);
     }
     else
     {
         var csidl = knownFolder.SpecialFolder();
         if (csidl == null)
         {
             throw new ArgumentOutOfRangeException(nameof(knownFolder), @"Cannot translate this known folder to a value understood by systems prior to Windows 7.");
         }
         var path = new StringBuilder(MAX_PATH);
         SHGetFolderPath(IntPtr.Zero, (int)csidl.Value, SafeTokenHandle.Null, SHGFP.SHGFP_TYPE_CURRENT, path).ThrowIfFailed();
         Init(ShellUtil.GetShellItemForPath(path.ToString()));
     }
 }
        private IEnumerable <IKnownFolder> GetAll()
        {
            KNOWNFOLDERID[] ids;

            object boxpIds = IntPtr.Zero;
            var    h       = GCHandle.Alloc(boxpIds, GCHandleType.Pinned);

            try
            {
                uint count = 0;
                this.knownFolderManager.GetFolderIds(h.AddrOfPinnedObject(), ref count);
                IntPtr pIds = (IntPtr)boxpIds;
                if (IntPtr.Zero == pIds)
                {
                    throw new InvalidOperationException("GetFolderIds returned NULL");
                }

                try
                {
                    ids = new KNOWNFOLDERID[count];
                    var ptr = pIds.ToInt64();
                    for (uint u = 0; u < count; ++u)
                    {
                        ids[u] = (KNOWNFOLDERID)Marshal.PtrToStructure((IntPtr)ptr, typeof(KNOWNFOLDERID));
                        ptr   += Marshal.SizeOf(typeof(KNOWNFOLDERID));
                    }
                }
                finally
                {
                    Marshal.FreeCoTaskMem(pIds);
                }
            }
            finally
            {
                h.Free();
            }

            var result = ids.Select(kfi => this.GetKnownFolderById(kfi));

            return(result);
        }
Пример #8
0
        public void Can_obtain_all_folder_ids()
        {
            var    knownFolderManager = (IKnownFolderManager) new KnownFolderManager();
            uint   count = 0;
            object ppIds = IntPtr.Zero;
            var    h     = GCHandle.Alloc(ppIds, GCHandleType.Pinned);

            try
            {
                knownFolderManager.GetFolderIds(h.AddrOfPinnedObject(), ref count);
                IntPtr pIds = (IntPtr)ppIds;
                if (IntPtr.Zero == pIds)
                {
                    throw new InvalidOperationException("GetFolderIds returned NULL");
                }

                try
                {
                    var ids = new KNOWNFOLDERID[count];
                    var ptr = pIds.ToInt64();
                    for (uint u = 0; u < count; ++u)
                    {
                        ids[u] = (KNOWNFOLDERID)Marshal.PtrToStructure((IntPtr)ptr, typeof(KNOWNFOLDERID));
                        ptr   += Marshal.SizeOf(typeof(KNOWNFOLDERID));
                    }

                    foreach (var id in ids)
                    {
                        Assert.AreNotEqual(Guid.Empty, id.value);
                    }
                }
                finally
                {
                    Marshal.FreeCoTaskMem(pIds);
                }
            }
            finally
            {
                h.Free();
            }
        }
Пример #9
0
        public void GetKnownFolderFromGuidTest()
        {
            const KNOWNFOLDERID id = KNOWNFOLDERID.FOLDERID_Desktop;

            Assert.That(GetKnownFolderFromGuid(id.Guid()), Is.EqualTo(id));
        }
Пример #10
0
 /// <summary>Retrieves the <see cref="Environment.SpecialFolder"/> associated with a <see cref="KNOWNFOLDERID"/> if it exists.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The <see cref="Environment.SpecialFolder"/> if defined, <c>null</c> otherwise.</returns>
 public static Environment.SpecialFolder?SpecialFolder(this KNOWNFOLDERID id) =>
 typeof(KNOWNFOLDERID).GetField(id.ToString()).GetCustomAttributes <KnownFolderDetailAttribute>().Select(a => (Environment.SpecialFolder?)a.Equivalent).FirstOrDefault();
Пример #11
0
 /// <summary>Retrieves the PIDL associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The PIDL.</returns>
 public static PIDL PIDL(this KNOWNFOLDERID id)
 {
     SHGetKnownFolderIDList(id.Guid(), stdGetFlags, HTOKEN.NULL, out var pidl);
     return(pidl);
 }
Пример #12
0
 /// <summary>Retrieves the name associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The name.</returns>
 public static string Name(this KNOWNFOLDERID id) => id.GetRegistryProperty <string>("Name");
Пример #13
0
 /// <summary>Retrieves the Guid associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The GUID associated with the <paramref name="id"/> or <see cref="Guid.Empty"/> if no association exists.</returns>
 public static Guid Guid(this KNOWNFOLDERID id) => AssociateAttribute.GetGuidFromEnum(id);
Пример #14
0
 /// <summary>Gets a registry property associated with this known folder.</summary>
 /// <typeparam name="T">Return type.</typeparam>
 /// <param name="id">The known folder.</param>
 /// <param name="valueName">Name of the property (value under registry key).</param>
 /// <returns>Retrieved value or default(T) if no value exists.</returns>
 public static T GetRegistryProperty <T>(this KNOWNFOLDERID id, string valueName) =>
 (T)Microsoft.Win32.Registry.GetValue(RegPath + id.Guid().ToString("B"), valueName, default(T));
Пример #15
0
 /// <summary>Retrieves the PIDL associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The PIDL.</returns>
 public static PIDL PIDL(this KNOWNFOLDERID id)
 {
     SHGetKnownFolderIDList(id.Guid(), stdGetFlags, SafeTokenHandle.Null, out var pidl);
     return(pidl);
 }
Пример #16
0
 /// <summary>Retrieves the full path associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The path.</returns>
 public static string FullPath(this KNOWNFOLDERID id)
 {
     SHGetKnownFolderPath(id.Guid(), stdGetFlags, HTOKEN.NULL, out var path);
     return(path);
 }
Пример #17
0
        public void GetKnownFolderFromPathTest()
        {
            const KNOWNFOLDERID id = KNOWNFOLDERID.FOLDERID_Desktop;

            Assert.That(GetKnownFolderFromPath(id.FullPath()), Is.EqualTo(id));
        }
Пример #18
0
 /// <summary>Retrieves the full path associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The path.</returns>
 public static string FullPath(this KNOWNFOLDERID id)
 {
     SHGetKnownFolderPath(id.Guid(), stdGetFlags, SafeTokenHandle.Null, out var path);
     return(path.ToString(-1));
 }
Пример #19
0
        public void GetPathForKnownFolderTest()
        {
            const KNOWNFOLDERID id = KNOWNFOLDERID.FOLDERID_Desktop;

            Assert.That(GetPathForKnownFolder(id.Guid()), Is.EqualTo(id.FullPath()));
        }
Пример #20
0
 /// <summary>Retrieves the IKnownFolder associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The <see cref="IKnownFolder"/> instance.</returns>
 public static IKnownFolder GetIKnownFolder(this KNOWNFOLDERID id) => new IKnownFolderManager().GetFolder(id.Guid());
Пример #21
0
 /// <summary>Retrieves the IShellFolder associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The <see cref="IShellFolder"/> instance.</returns>
 public static IShellFolder GetIShellFolder(this KNOWNFOLDERID id)
 {
     using var desktop = ComReleaserFactory.Create(new ShellDesktop() as IShellFolder);
     using var pidl    = id.PIDL();
     return(desktop.Item.BindToObject <IShellFolder>(pidl));
 }
Пример #22
0
 /// <summary>Initializes a new instance of the <see cref="ShellLibrary"/> class.</summary>
 /// <param name="knownFolderId">The known folder identifier.</param>
 /// <param name="readOnly">if set to <c>true</c> [read only].</param>
 public ShellLibrary2(KNOWNFOLDERID knownFolderId, bool readOnly = false)
 {
     lib = new IShellLibrary();
     lib.LoadLibraryFromKnownFolder(knownFolderId.Guid(), readOnly ? STGM.STGM_READ : STGM.STGM_READWRITE);
     Init(knownFolderId.GetIShellItem());
 }
Пример #23
0
 /// <summary>Retrieves the IShellItem associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The <see cref="IShellItem"/> instance.</returns>
 public static IShellItem GetIShellItem(this KNOWNFOLDERID id)
 {
     SHGetKnownFolderItem(id.Guid(), KNOWN_FOLDER_FLAG.KF_FLAG_DEFAULT, HTOKEN.NULL, typeof(IShellItem).GUID, out var ppv).ThrowIfFailed();
     return((IShellItem)ppv);
 }
Пример #24
0
 /// <summary>Initializes a new instance of the <see cref="ShellItem"/> class.</summary>
 /// <param name="knownFolder">A known folder value.</param>
 public ShellFolder(KNOWNFOLDERID knownFolder) : base(knownFolder)
 {
     iShellFolder = GetInstance();
 }
Пример #25
0
 /// <summary>Retrieves the name associated with a <see cref="KNOWNFOLDERID"/>.</summary>
 /// <param name="id">The known folder.</param>
 /// <returns>The name.</returns>
 public static string Name(this KNOWNFOLDERID id) => id.GetIKnownFolder().Name();