前言
從業以來,數次踩中編碼的坑, 這次又馬失前蹄 , 真是事不過三此非彼白.
本來這個小問題不打算拿出來說 , 但是翻看谷歌發現若干年前也有寥寥數人遇到碰到這個問題 ,而且都并沒有給出一個可行的解決方案 ,現在問題依然掛在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 接下來是 獲取文件夾路徑的簡單例子
以上用到的一個GBK轉碼庫 位置查看 - github傳送門 0x01.GBK轉碼 以下是關鍵的一段代碼:
谷歌上找到的一個方案是把項目編碼全部改為unicode , 但是C#項目里貌似沒這個設定 , 所以使用SHGetPathFromIDList拿出的數據直接轉碼即可支持中文.(全部為英文的路徑也不會有影響) 總結 以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。 原文鏈接:http://shadowkong.com/archives/2409 延伸 · 閱讀
精彩推薦
|