

Windows C#で次のようなコードを書いた場合に、以下の点がわかりません。

[code]

    System.IO.DriveInfo drive = new System.IO.DriveInfo("Z");
    if (drive.IsReady)
    {
    string s;
    s = string.Format("{0:f1} GB/{1:f1} GB", drive.TotalFreeSpace/1024 / 1024 / 1024, drive.TotalSize / 1024 / 1024 / 1024);
    //  以下略
    }
    
[/code]

これを1秒おきに実行した際

  1. どのようにして情報が取得されるのか(ディスクに都度アクセスするのか)
  2. アクセスするとした場合、寿命に影響があるのか
  3. 実際にどのようにして値を取得しているかを調べる方法があるのか
  4. 1秒おきに取得する方法以外の手段はあるのか
  5. このコードの問題点があれば教えてください


CC BY-SA 4.0
2018-07-11T12:38:34.040
45517
2018-07-12T00:03:37.627
29124
question
c# windows
System.IO.DriveInfoでの値の取得について


> 実際にどのようにして値を取得しているかを調べる方法があるのか

System.IO.DriveInfoの実装については、[driveinfo.cs](https://referencesource.microsoft.com/#mscorlib/system/io/driveinfo.cs,167)でわかります。  
`TotalFreeSpace`や`TotalSize`はWindows
APIの[GetDiskFreeSpaceEx](https://msdn.microsoft.com/ja-
jp/library/cc429308.aspx)を仕様しているようです。

`GetDiskFreeSpaceEx`がどのように情報を取得しているかは、APIのドキュメントからはわかりませんでした。詳細は
Microsoftのサポートに問いあわせると回答が得れるかもしれません。


CC BY-SA 4.0
2018-07-11T12:55:22.557
45519
2018-07-11T12:55:22.557
45517
answer


> 1秒おきに取得する方法以外の手段はあるのか

取得する目的は何でしょう？ USB メモリや SD
カードの着脱検出？ネットワークドライブの接続切断検出？ディスク容量の残量チェック？それ次第で別の提案ができるかもしれません。

接続済み USB メモリの容量チェックを１秒おきに行うってことは「安全に取り外し」メニューも満足に使えませんし UX
面では最低です。オイラならこういうコードを書くことは絶対にしないと思います。

ドライブ名自体の着脱検出なら `WM_DEVICECHANGE` をハンドルしてそのときのドライブ情報を得れば十分。  
<http://d.hatena.ne.jp/ohyajapan/20081123/p1>

ドライブ内に CD/DVD/BLURAY メディアが着脱されたかも `WM_DEVICECHANGE` で可能  
<https://support.microsoft.com/ja-jp/help/163503/how-to-receive-notification-
of-cd-rom-insertion-or-removal>

その他なら「なぜ、なにをやりたい」のかを元質問の編集で付け加えてもらうと別回答が付くかもしれません。


CC BY-SA 4.0
2018-07-12T00:03:37.627
45527
2018-07-12T00:03:37.627
8589
45517
answer