DiskOfflineHelper.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /* Copyright (C) 2014-2016 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
  2. *
  3. * You can redistribute this program and/or modify it under the terms of
  4. * the GNU Lesser Public License as published by the Free Software Foundation,
  5. * either version 3 of the License, or (at your option) any later version.
  6. */
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. namespace DiskAccessLibrary.LogicalDiskManager
  11. {
  12. public class DiskOfflineHelper
  13. {
  14. public static bool IsDiskGroupOnlineAndWritable(Guid diskGroupGuid)
  15. {
  16. List<DynamicDisk> diskGroup = WindowsDynamicDiskHelper.GetPhysicalDynamicDisks(diskGroupGuid);
  17. return IsDiskGroupOnlineAndWritable(diskGroup);
  18. }
  19. public static bool IsDiskGroupOnlineAndWritable(List<DynamicDisk> diskGroup)
  20. {
  21. List<PhysicalDisk> physicalDisks = new List<PhysicalDisk>();
  22. foreach (DynamicDisk dynamicDisk in diskGroup)
  23. {
  24. if (dynamicDisk.Disk is PhysicalDisk)
  25. {
  26. physicalDisks.Add((PhysicalDisk)dynamicDisk.Disk);
  27. }
  28. }
  29. foreach (PhysicalDisk disk in physicalDisks)
  30. {
  31. bool isReadOnly;
  32. bool isOnline = disk.GetOnlineStatus(out isReadOnly,out _)?? false;
  33. if (!isOnline || isReadOnly)
  34. {
  35. return false;
  36. }
  37. }
  38. return true;
  39. }
  40. /// <summary>
  41. /// Will not persist across reboots
  42. /// </summary>
  43. public static bool OfflineDiskGroup(Guid diskGroupGuid)
  44. {
  45. List<DynamicDisk> disksToOffline = WindowsDynamicDiskHelper.GetPhysicalDynamicDisks(diskGroupGuid);
  46. return OfflineAllOrNone(disksToOffline);
  47. }
  48. public static void OnlineDiskGroup(Guid diskGroupGuid)
  49. {
  50. List<DynamicDisk> disksToOnline = WindowsDynamicDiskHelper.GetPhysicalDynamicDisks(diskGroupGuid);
  51. OnlineAll(disksToOnline);
  52. }
  53. /// <summary>
  54. /// Will not persist across reboots
  55. /// </summary>
  56. public static bool OfflineAllOrNone(List<DynamicDisk> disksToOffline)
  57. {
  58. List<PhysicalDisk> physicalDisks = new List<PhysicalDisk>();
  59. foreach (DynamicDisk dynamicDisk in disksToOffline)
  60. {
  61. if (dynamicDisk.Disk is PhysicalDisk)
  62. {
  63. physicalDisks.Add((PhysicalDisk)dynamicDisk.Disk);
  64. }
  65. }
  66. return PhysicalDiskHelper.OfflineAllOrNone(physicalDisks);
  67. }
  68. public static void OnlineAll(List<DynamicDisk> disksToOnline)
  69. {
  70. foreach (DynamicDisk disk in disksToOnline)
  71. {
  72. ((PhysicalDisk)disk.Disk).SetOnlineStatus(true);
  73. }
  74. }
  75. }
  76. }