// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft. All rights reserved.
namespace Microsoft.Samples.HyperV.Storage
{
using System;
using System.Globalization;
using System.Management;
using Microsoft.Samples.HyperV.Common;
static class StorageCompactSample
{
///
/// Compacts a VHD or VHDX.
///
/// The name of the server on which to perform the action.
/// The path to the VHD to compact.
/// The mode of the compact operation.
internal static void
CompactVirtualHardDisk(
string ServerName,
string VirtualHardDiskPath,
string Mode)
{
//
// To obtain the full benefit of compaction, the VHD or VHDX should be mounted prior to
// and throughout the compaction.
//
// Mounting a VHD is demonstrated in the AttachVirtualDisk sample.
//
// The VHD can only be mounted read-only during compaction.
//
ManagementScope scope =
new ManagementScope("\\\\" + ServerName + "\\root\\virtualization\\v2");
using (ManagementObject imageManagementService =
StorageUtilities.GetImageManagementService(scope))
{
using (ManagementBaseObject inParams =
imageManagementService.GetMethodParameters("CompactVirtualHardDisk"))
{
inParams["Path"] = VirtualHardDiskPath;
inParams["Mode"] = Mode;
using (ManagementBaseObject outParams = imageManagementService.InvokeMethod(
"CompactVirtualHardDisk", inParams, null))
{
WmiUtilities.ValidateOutput(outParams, scope);
}
}
}
}
}
}