国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#如何使用SHBrowseForFolder導出中文文件夾詳解

C#如何使用SHBrowseForFolder導出中文文件夾詳解

2022-03-05 17:04RECT C#

這篇文章主要給大家介紹了關于C#如何使用SHBrowseForFolder導出中文文件夾的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習合作工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

從業以來,數次踩中編碼的坑, 這次又馬失前蹄 , 真是事不過三此非彼白.

本來這個小問題不打算拿出來說 , 但是翻看谷歌發現若干年前也有寥寥數人遇到碰到這個問題 ,而且都并沒有給出一個可行的解決方案 ,現在問題依然掛在CSDN等地方 , 似乎不會再有人去回答了, 或者其實題主們后面解決了但并沒有回頭來提供解決方案. 現在由我來”終結此貼”

SHBrowseForFolder是一個可以用于獲取文件夾路徑的Windows API。使用起來可以方便很多,文中將詳細介紹關于C#使用SHBrowseForFolder導出中文文件夾的相關內容 ,下面話不多說了,來一起看看詳細的介紹吧

0x00.使用SHBrowseForFolder選擇文件夾

(大段代碼來襲 , 不想看可直接拉到底看關鍵的幾行)

底層接口 – 選擇文件夾相關

?

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        107
        108
        109
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
        120
        121
        122
        123
        124
        125
        126
        127
        128
        129
        130
        131
        132
        133
        134
        135
        136
        137
        138
        139
        140
        141
        142
        143
        144
        145
        146
        147
        148
        //-------------------------------------------------------------------------
        class Win32API
        {
         // C# representation of the IMalloc interface.
         [InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
         Guid("00000002-0000-0000-C000-000000000046")]
         public interface IMalloc
         {
         [PreserveSig]
         IntPtr Alloc([In] int cb);
         [PreserveSig]
         IntPtr Realloc([In] IntPtr pv, [In] int cb);
         [PreserveSig]
         void Free([In] IntPtr pv);
         [PreserveSig]
         int GetSize([In] IntPtr pv);
         [PreserveSig]
         int DidAlloc(IntPtr pv);
         [PreserveSig]
         void HeapMinimize();
         }
         
         [StructLayout(LayoutKind.Sequential, Pack = 8)]
         public struct BROWSEINFO
         {
         public IntPtr hwndOwner;
         public IntPtr pidlRoot;
         public IntPtr pszDisplayName;
         [MarshalAs(UnmanagedType.LPTStr)]
         public string lpszTitle;
         public int ulFlags;
         [MarshalAs(UnmanagedType.FunctionPtr)]
         public Shell32.BFFCALLBACK lpfn;
         public IntPtr lParam;
         public int iImage;
         }
         
         [Flags]
         public enum BffStyles
         {
         RestrictToFilesystem = 0x0001, // BIF_RETURNONLYFSDIRS
         RestrictToDomain = 0x0002, // BIF_DONTGOBELOWDOMAIN
         RestrictToSubfolders = 0x0008, // BIF_RETURNFSANCESTORS
         ShowTextBox = 0x0010, // BIF_EDITBOX
         ValidateSelection = 0x0020, // BIF_VALIDATE
         NewDialogStyle = 0x0040, // BIF_NEWDIALOGSTYLE
         BrowseForComputer = 0x1000, // BIF_BROWSEFORCOMPUTER
         BrowseForPrinter = 0x2000, // BIF_BROWSEFORPRINTER
         BrowseForEverything = 0x4000, // BIF_BROWSEINCLUDEFILES
         }
         
         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
         public class OpenFileName
         {
         public int structSize = 0;
         public IntPtr dlgOwner = IntPtr.Zero;
         public IntPtr instance = IntPtr.Zero;
         public String filter = null;
         public String customFilter = null;
         public int maxCustFilter = 0;
         public int filterIndex = 0;
         public String file = null;
         public int maxFile = 0;
         public String fileTitle = null;
         public int maxFileTitle = 0;
         public String initialDir = null;
         public String id="codetool">

        簡單介紹一下 Win32API 所有接口的結構體 都是參照SHBrowseForFolder函數而寫 , Win32Instance 主要是精確的獲取當前進程的ID

        接下來是 獲取文件夾路徑的簡單例子

        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        //-------------------------------------------------------------------------
        private void __SelectFolder(out string directoryPath)
        {
         directoryPath = "null";
         try
         {
         IntPtr pidlRet = IntPtr.Zero;
         int publicOptions = (int)Win32API.BffStyles.RestrictToFilesystem |
         (int)Win32API.BffStyles.RestrictToDomain;
         int privateOptions = (int)Win32API.BffStyles.NewDialogStyle;
         
         // Construct a BROWSEINFO.
         Win32API.BROWSEINFO bi = new Win32API.BROWSEINFO();
         IntPtr buffer = Marshal.AllocHGlobal(1024);
         int mergedOptions = (int)publicOptions | (int)privateOptions;
         bi.pidlRoot = IntPtr.Zero;
         bi.pszDisplayName = buffer;
         bi.lpszTitle = "文件夾";
         bi.ulFlags = mergedOptions;
         
         Win32Instance w = new Win32Instance();
         bool bSuccess = false;
         IntPtr P = w.GetHandle(ref bSuccess);
         if (true == bSuccess)
         {
          bi.hwndOwner = P;
         }
         
         pidlRet = Win32API.Shell32.SHBrowseForFolder(ref bi);
         Marshal.FreeHGlobal(buffer);
         
         if (pidlRet == IntPtr.Zero)
         {
          // User clicked Cancel.
          return;
         }
         
         byte[] pp = new byte[2048];
         if (0 == Win32API.Shell32.SHGetPathFromIDList(pidlRet, pp))
         {
          return;
         }
         
         int nSize = 0;
         for (int i = 0; i < 2048; i++)
         {
          if (0 != pp[i])
          {
          nSize++;
          }
          else
          {
          break;
          }
         
         }
         
         if (0 == nSize)
         {
          return;
         }
         
         byte[] pReal = new byte[nSize];
         Array.Copy(pp, pReal, nSize);
         // 關鍵轉碼部分
         Gb2312Encoding gbk = new Gb2312Encoding();
         Encoding utf8 = Encoding.UTF8;
         byte[] utf8Bytes = Encoding.Convert(gbk, utf8, pReal);
         string utf8String = utf8.GetString(utf8Bytes);
         utf8String = utf8String.Replace("\0", "");
         directoryPath = utf8String.Replace("\\", "/") + "/";
         
         }
         catch (Exception e)
         {
         Console.WriteLine("獲取文件夾目錄出錯:" + e.Message);
         }
        }

        以上用到的一個GBK轉碼庫 位置查看 - github傳送門

        0x01.GBK轉碼

        以下是關鍵的一段代碼:

        ?
        1
        2
        3
        4
        5
        Gb2312Encoding gbk = new Gb2312Encoding();
        Encoding utf8 = Encoding.UTF8;
        byte[] utf8Bytes = Encoding.Convert(gbk, utf8, pReal);
        string utf8String = utf8.GetString(utf8Bytes);
        utf8String = utf8String.Replace("\0", "");

        谷歌上找到的一個方案是把項目編碼全部改為unicode , 但是C#項目里貌似沒這個設定 , 所以使用SHGetPathFromIDList拿出的數據直接轉碼即可支持中文.(全部為英文的路徑也不會有影響)

        總結

        以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

        原文鏈接:http://shadowkong.com/archives/2409

        延伸 · 閱讀

        精彩推薦
        • C#C#實現XML文件讀取

          C#實現XML文件讀取

          這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

          Just_for_Myself6702022-02-22
        • C#WPF 自定義雷達圖開發實例教程

          WPF 自定義雷達圖開發實例教程

          這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

          WinterFish13112021-12-06
        • C#C#裁剪,縮放,清晰度,水印處理操作示例

          C#裁剪,縮放,清晰度,水印處理操作示例

          這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

          吳 劍8332021-12-08
        • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

          C# 實現對PPT文檔加密、解密及重置密碼的操作方法

          這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

          E-iceblue5012022-02-12
        • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

          C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

          這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

          GhostRider9502022-01-21
        • C#Unity3D實現虛擬按鈕控制人物移動效果

          Unity3D實現虛擬按鈕控制人物移動效果

          這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

          shenqingyu060520232410972022-03-11
        • C#深入解析C#中的交錯數組與隱式類型的數組

          深入解析C#中的交錯數組與隱式類型的數組

          這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

          C#教程網6172021-11-09
        • C#C#通過KD樹進行距離最近點的查找

          C#通過KD樹進行距離最近點的查找

          這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

          帆帆帆6112022-01-22
        主站蜘蛛池模板: 欧美日韩国产成人 | 国产精品剧情一区二区三区 | 国产精品久久久99 | 久久网一区二区三区 | 欧美日韩一区二区三区在线观看 | 欧美色涩| 欧美成人免费视频 | 夜夜久久| 欧美日韩一级二级三级 | 亚洲一区二区三区精品动漫 | 精品一区国产 | 欧美激情视频一区二区三区在线播放 | 成人一区二区在线 | 午夜大片男女免费观看爽爽爽尤物 | 亚洲国产精品久久久久久 | 91高清在线 | 久久久久亚洲 | 最新中文字幕 | www.色综合 | 国产精品亲子伦av一区二区三区 | 毛片黄视频| 亚洲视频区 | 日韩av免费在线观看 | 亚洲91av| av免费影视 | 国产精品1 | 91中文字幕 | 欧美91在线| 影音先锋男人网 | 美女视频一区二区三区 | 黄色片视频免费看 | 欧美日韩一区二区三区不卡视频 | 国产高清无密码一区二区三区 | 在线看的av| 免费看黄色av | 日韩成人 | 亚洲国产精品久久久久婷婷老年 | 精品久久久久一区二区国产 | 国产日产精品一区二区三区四区 | 精品第一页 | 久草福利资源 |