天天看點

【C#】WindowsAPICodePack-Shell使用教程1.首先在項目中添加WindowsAPICodePack的Nuget包。2.擷取《我的電腦》的名字和電腦圖示3.擷取檔案/檔案夾的圖示4.擷取檔案/檔案夾的屬性資訊

原文: 【C#】WindowsAPICodePack-Shell使用教程

1.首先在項目中添加WindowsAPICodePack的Nuget包。

【C#】WindowsAPICodePack-Shell使用教程1.首先在項目中添加WindowsAPICodePack的Nuget包。2.擷取《我的電腦》的名字和電腦圖示3.擷取檔案/檔案夾的圖示4.擷取檔案/檔案夾的屬性資訊

  點選安裝即可。

2.擷取《我的電腦》的名字和電腦圖示

ShellObject so = ShellFileSystemFolder.FromParsingName(KnownFolders.Computer.ParsingName);
                displayName = so.Name;
                Bitmap bm = so.Thumbnail.SmallBitmap;
                bm.MakeTransparent(System.Drawing.Color.Black);      

其中,so.Name就是“我的電腦”的名字,注意不是機器名哦,機器名可以直接通過Environment.MachineName擷取。

電腦圖示可以通過so的Thumbnail擷取,可以獲得SmallBitmap,Bitmap,LargeBitmap,SmallIco,Ico,LargeIco等。不過由于擷取到的Bitmap的背景色由之前的透明色變成了黑色,可以是因為api的原因,是以需要我們用MakeTransparent手動轉為透明色。

擷取到的電腦圖示如下:

【C#】WindowsAPICodePack-Shell使用教程1.首先在項目中添加WindowsAPICodePack的Nuget包。2.擷取《我的電腦》的名字和電腦圖示3.擷取檔案/檔案夾的圖示4.擷取檔案/檔案夾的屬性資訊

其中,KownFolders這個類功能很豐富,裡面包含系統的一些特殊檔案夾,如“我的檔案”、“我的音樂”、“桌面”、“網絡連接配接”等,可直接通路。比.Net Framework裡的Environment.SpecialFolders更強大。

3.擷取檔案/檔案夾的圖示

擷取檔案夾資訊時,可以調用ShellFolder.FromParsingName(string FolderPath),它傳回一個ShellObject對象,通過此對象的Thumbnail屬性可以得到圖示,方法如第二步。

擷取檔案圖示時,調用ShellFile.FromFilePath(string filePath),傳回一個ShellFile對象,調用對象的Thumbnail屬性可以獲得圖示。

4.擷取檔案/檔案夾的屬性資訊

4.1擷取指定的屬性資訊

ShellPropertyCollection props = new ShellPropertyCollection(path);
            typeName = props.Where(prop => prop.CanonicalName == "System.IsFolder").First().FormatForDisplay(PropertyDescriptionFormatOptions.None);      

以上,代碼可以獲得一個值用來判斷給定的path是一個檔案夾還是一個檔案。

4.2擷取檔案/檔案夾所有不為null的屬性資訊

ShellPropertyCollection cooll = new ShellPropertyCollection(@"c:");
            var properties = cooll.Where(prop => prop.CanonicalName != null).OrderBy(prop=>prop.CanonicalName).ToArray();
            Array.ForEach(
               properties,
               p =>
               {
                   DisplayPropertyValue(p);
               });      

其中,DisplayPropertyValue()方法為:

private static void DisplayPropertyValue(IShellProperty prop)
        {
            string value = string.Empty;
            value = prop.ValueAsObject == null ? "" : prop.FormatForDisplay(
                    PropertyDescriptionFormatOptions.None);
            Debug.WriteLine(prop.CanonicalName + "-------" + value);
        }      

如例子所示,C:這個檔案夾的屬性資訊如圖:

【C#】WindowsAPICodePack-Shell使用教程1.首先在項目中添加WindowsAPICodePack的Nuget包。2.擷取《我的電腦》的名字和電腦圖示3.擷取檔案/檔案夾的圖示4.擷取檔案/檔案夾的屬性資訊

(檔案夾的不同,可展示出來的屬性資訊數量也不同)

如果把C:改為一個檔案的路徑,如:C:\1.txt。它的屬性資訊為(沒有完全截出來):

【C#】WindowsAPICodePack-Shell使用教程1.首先在項目中添加WindowsAPICodePack的Nuget包。2.擷取《我的電腦》的名字和電腦圖示3.擷取檔案/檔案夾的圖示4.擷取檔案/檔案夾的屬性資訊

擷取某個盤符的名稱:

var item=ShellFileSystemFolder.FromFolderPath("c:\\");

            Console.WriteLine(string.Format("displayname is {0},name is {1}", item.GetDisplayName(DisplayNameType.Default), item.Name));
         
            Console.Read();      

輸出:displayname is Local Disk (C:),name is Local Disk (C:)

最後:送給大家項目的github位址:

https://github.com/aybe/Windows-API-Code-Pack-1.1

其中source/Samples裡有各種各樣的Demo,大家可以參考。

繼續閱讀