• R/O
  • HTTP
  • SSH
  • HTTPS

提交

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

フレンドリネームに" USB "を含むディスクドライブをリフレッシュ


Commit MetaInfo

修订版7753e014126a4a434c5f71c022e778d51bae7ee3 (tree)
时间2019-01-05 14:40:50
作者Yasushi Tanaka <tanaka_yasushi2008@yaho...>
CommiterYasushi Tanaka

Log Message

リフレッシュ後にエクスプローラで開き、自動でフォームを閉じる

更改概述

差异

--- a/VCS2010/DiskRefresh/MainForm.cs
+++ b/VCS2010/DiskRefresh/MainForm.cs
@@ -21,6 +21,16 @@ namespace DiskRefresh
2121 private int refreshResultCounter = 0;
2222
2323 /// <summary>
24+ /// 有効状態の論理ドライブ名並び
25+ /// </summary>
26+ private string[] enabledLogicalDrives = null;
27+
28+ /// <summary>
29+ /// 無効状態の論理ドライブ名並び
30+ /// </summary>
31+ private string[] disabledLogicalDrives = null;
32+
33+ /// <summary>
2434 /// コンストラクタ
2535 /// </summary>
2636 public MainForm()
@@ -49,6 +59,14 @@ namespace DiskRefresh
4959 /// <param name="e">イベントパラメータ</param>
5060 private void RefreshTimer_Tick(object sender, EventArgs e)
5161 {
62+ // ドライブ並びが両方とも有効な場合は
63+ if ((enabledLogicalDrives != null) && (disabledLogicalDrives != null))
64+ {
65+ // 無効化したディスクに対応するドライブレターを検出し、エクスプローラで開く
66+ openDrive();
67+ }
68+
69+
5270 // タイマが有効な場合は
5371 if (refreshResultCounter > 0)
5472 {
@@ -93,6 +111,9 @@ namespace DiskRefresh
93111 return;
94112 }
95113
114+ // 有効時の論理ドライブ並びを取得
115+ enabledLogicalDrives = getLogicalDrives();
116+
96117 // デバイスの無効化
97118 GuideLabel.Text = "USBディスクをリフレッシュしています\nしばらくお待ちください…";
98119 Application.DoEvents();
@@ -104,6 +125,9 @@ namespace DiskRefresh
104125 return;
105126 }
106127
128+ // 無効時の論理ドライブ並びを取得
129+ disabledLogicalDrives = getLogicalDrives();
130+
107131 // デバイスの有効化を試みる
108132 GuideLabel.Text = "USBディスクを有効化しています\nしばらくお待ちください";
109133 Application.DoEvents();
@@ -118,9 +142,6 @@ namespace DiskRefresh
118142 // デバイスをリフレッシュした
119143 this.Cursor = Cursors.Default;
120144 GuideLabel.Text = "USBディスクをリフレッシュしました\nエクスプローラが開くまで、しばらくお待ちください";
121-
122- // フォームを閉じる
123- this.Close();
124145 }
125146
126147 /// <summary>
@@ -157,5 +178,94 @@ namespace DiskRefresh
157178 RefreshButton.Enabled = false;
158179 }
159180 }
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+ }
160270 }
161271 }