WindowsMountedVolumeInfoListener.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Reactive.Disposables;
  6. using System.Reactive.Linq;
  7. using Avalonia.Controls.Platform;
  8. namespace Avalonia.Win32
  9. {
  10. internal class WindowsMountedVolumeInfoListener : IDisposable
  11. {
  12. private readonly CompositeDisposable _disposables;
  13. private bool _beenDisposed = false;
  14. private ObservableCollection<MountedVolumeInfo> mountedDrives;
  15. public WindowsMountedVolumeInfoListener(ObservableCollection<MountedVolumeInfo> mountedDrives)
  16. {
  17. this.mountedDrives = mountedDrives;
  18. _disposables = new CompositeDisposable();
  19. var pollTimer = Observable.Interval(TimeSpan.FromSeconds(1))
  20. .Subscribe(Poll);
  21. _disposables.Add(pollTimer);
  22. Poll(0);
  23. }
  24. private void Poll(long _)
  25. {
  26. var allDrives = DriveInfo.GetDrives();
  27. var mountVolInfos = allDrives
  28. .Select(p => new MountedVolumeInfo()
  29. {
  30. VolumeLabel = p.VolumeLabel,
  31. VolumePath = p.RootDirectory.FullName,
  32. VolumeSizeBytes = (ulong)p.TotalSize
  33. })
  34. .ToArray();
  35. if (mountedDrives.SequenceEqual(mountVolInfos))
  36. return;
  37. else
  38. {
  39. mountedDrives.Clear();
  40. foreach (var i in mountVolInfos)
  41. mountedDrives.Add(i);
  42. }
  43. }
  44. protected virtual void Dispose(bool disposing)
  45. {
  46. if (!_beenDisposed)
  47. {
  48. if (disposing)
  49. {
  50. }
  51. _beenDisposed = true;
  52. }
  53. }
  54. public void Dispose()
  55. {
  56. Dispose(true);
  57. }
  58. }
  59. }