フレンドリネームに" USB "を含むディスクドライブをリフレッシュ
修订版 | 7753e014126a4a434c5f71c022e778d51bae7ee3 (tree) |
---|---|
时间 | 2019-01-05 14:40:50 |
作者 | Yasushi Tanaka <tanaka_yasushi2008@yaho...> |
Commiter | Yasushi Tanaka |
リフレッシュ後にエクスプローラで開き、自動でフォームを閉じる
@@ -21,6 +21,16 @@ namespace DiskRefresh | ||
21 | 21 | private int refreshResultCounter = 0; |
22 | 22 | |
23 | 23 | /// <summary> |
24 | + /// 有効状態の論理ドライブ名並び | |
25 | + /// </summary> | |
26 | + private string[] enabledLogicalDrives = null; | |
27 | + | |
28 | + /// <summary> | |
29 | + /// 無効状態の論理ドライブ名並び | |
30 | + /// </summary> | |
31 | + private string[] disabledLogicalDrives = null; | |
32 | + | |
33 | + /// <summary> | |
24 | 34 | /// コンストラクタ |
25 | 35 | /// </summary> |
26 | 36 | public MainForm() |
@@ -49,6 +59,14 @@ namespace DiskRefresh | ||
49 | 59 | /// <param name="e">イベントパラメータ</param> |
50 | 60 | private void RefreshTimer_Tick(object sender, EventArgs e) |
51 | 61 | { |
62 | + // ドライブ並びが両方とも有効な場合は | |
63 | + if ((enabledLogicalDrives != null) && (disabledLogicalDrives != null)) | |
64 | + { | |
65 | + // 無効化したディスクに対応するドライブレターを検出し、エクスプローラで開く | |
66 | + openDrive(); | |
67 | + } | |
68 | + | |
69 | + | |
52 | 70 | // タイマが有効な場合は |
53 | 71 | if (refreshResultCounter > 0) |
54 | 72 | { |
@@ -93,6 +111,9 @@ namespace DiskRefresh | ||
93 | 111 | return; |
94 | 112 | } |
95 | 113 | |
114 | + // 有効時の論理ドライブ並びを取得 | |
115 | + enabledLogicalDrives = getLogicalDrives(); | |
116 | + | |
96 | 117 | // デバイスの無効化 |
97 | 118 | GuideLabel.Text = "USBディスクをリフレッシュしています\nしばらくお待ちください…"; |
98 | 119 | Application.DoEvents(); |
@@ -104,6 +125,9 @@ namespace DiskRefresh | ||
104 | 125 | return; |
105 | 126 | } |
106 | 127 | |
128 | + // 無効時の論理ドライブ並びを取得 | |
129 | + disabledLogicalDrives = getLogicalDrives(); | |
130 | + | |
107 | 131 | // デバイスの有効化を試みる |
108 | 132 | GuideLabel.Text = "USBディスクを有効化しています\nしばらくお待ちください"; |
109 | 133 | Application.DoEvents(); |
@@ -118,9 +142,6 @@ namespace DiskRefresh | ||
118 | 142 | // デバイスをリフレッシュした |
119 | 143 | this.Cursor = Cursors.Default; |
120 | 144 | GuideLabel.Text = "USBディスクをリフレッシュしました\nエクスプローラが開くまで、しばらくお待ちください"; |
121 | - | |
122 | - // フォームを閉じる | |
123 | - this.Close(); | |
124 | 145 | } |
125 | 146 | |
126 | 147 | /// <summary> |
@@ -157,5 +178,94 @@ namespace DiskRefresh | ||
157 | 178 | RefreshButton.Enabled = false; |
158 | 179 | } |
159 | 180 | } |
181 | + | |
182 | + /// <summary> | |
183 | + /// 無効化したディスクに対応するドライブレターを検出し、エクスプローラで開く | |
184 | + /// </summary> | |
185 | + private void openDrive() | |
186 | + { | |
187 | + // 現在の論理ドライブ並びを取得 | |
188 | + string[] currentLogicalDrives = getLogicalDrives(); | |
189 | + | |
190 | + // 現在の論理ドライブ並びが無効であれば何もしない | |
191 | + if (currentLogicalDrives == null) | |
192 | + { | |
193 | + return; | |
194 | + } | |
195 | + | |
196 | + // 有効時と異なっていれば、まだドライブが認識されていないことを示すため何もしない | |
197 | + if (currentLogicalDrives.Length != enabledLogicalDrives.Length) | |
198 | + { | |
199 | + return; | |
200 | + } | |
201 | + | |
202 | + // 無効時と同じであれば、ドライブの差を検出できないため何もしない | |
203 | + if (currentLogicalDrives.Length == disabledLogicalDrives.Length) | |
204 | + { | |
205 | + return; | |
206 | + } | |
207 | + | |
208 | + // 現在のドライブ名を回る | |
209 | + foreach (string drive in currentLogicalDrives) | |
210 | + { | |
211 | + bool match = false; | |
212 | + | |
213 | + // 現在のドライブ名が、無効時のドライブ名並びに含まれている文字列か調べる | |
214 | + foreach (string disabledDrive in disabledLogicalDrives) | |
215 | + { | |
216 | + if (drive.Equals(disabledDrive)) | |
217 | + { | |
218 | + match = true; | |
219 | + break; | |
220 | + } | |
221 | + } | |
222 | + | |
223 | + // 含まれていれば、無効化したデバイスと関係ないドライブなので、continue | |
224 | + if (match) | |
225 | + { | |
226 | + continue; | |
227 | + } | |
228 | + | |
229 | + | |
230 | + // このドライブをエクスプローラで開く | |
231 | + System.Diagnostics.Process.Start(drive); | |
232 | + | |
233 | + // タイマを止める | |
234 | + RefreshTimer.Enabled = false; | |
235 | + | |
236 | + // フォームを閉じる | |
237 | + Close(); | |
238 | + } | |
239 | + } | |
240 | + | |
241 | + /// <summary> | |
242 | + /// 論理ドライブ名の並びを取得 | |
243 | + /// </summary> | |
244 | + /// <returns>ドライブ文字:\スタイルの文字列配列</returns> | |
245 | + private string[] getLogicalDrives() | |
246 | + { | |
247 | + string[] drives = null; | |
248 | + | |
249 | + try | |
250 | + { | |
251 | + // 論理ドライブ名を"<ドライブ文字>:\"の形式で取得 | |
252 | + drives = System.IO.Directory.GetLogicalDrives(); | |
253 | + } | |
254 | + | |
255 | + // I/Oエラーが発生した(ディスクエラーなど) | |
256 | + catch (System.IO.IOException) | |
257 | + { | |
258 | + return null; | |
259 | + } | |
260 | + | |
261 | + // 呼び出し元に必要なアクセス許可がない | |
262 | + catch (System.Security.SecurityException) | |
263 | + { | |
264 | + return null; | |
265 | + } | |
266 | + | |
267 | + // 文字列配列として返す | |
268 | + return drives; | |
269 | + } | |
160 | 270 | } |
161 | 271 | } |