public static async Task Create(string loc, HDFileType fileType, long size, CancellationToken cancellationToken, IProgress <Tuple <int, string> > progress, DeviceType type = DeviceType.DeviceType_HardDisk, bool dynamic = true, bool splitFile = false)
        {
            var vdi      = Client.VBox.CreateMedium(fileType.ToString(), loc, AccessMode.AccessMode_ReadWrite, type);
            var variants = new MediumVariant[32];
            var i        = 0;

            if (!dynamic)
            {
                variants[i++] = MediumVariant.MediumVariant_Fixed;
            }
            if (splitFile && fileType == HDFileType.VMDK)
            {
                variants[i] = MediumVariant.MediumVariant_VmdkSplit2G;
            }
            await Client.ProcessProgress(vdi.CreateBaseStorage(size, variants), cancellationToken, progress);
        }
        public static async Task CloneAsync(string src, string dest, HDFileType ft, bool dyn, bool split, CancellationToken cancellationToken, IProgress <Tuple <int, string> > progress)
        {
            if (string.IsNullOrEmpty(Path.GetDirectoryName(dest)))
            {
                dest = Path.Combine(Path.GetDirectoryName(src), Path.GetFileName(dest));
            }
            var vdi      = OpenMedium(src, AccessMode.AccessMode_ReadOnly);
            var newVdi   = Client.VBox.CreateMedium(ft.ToString(), dest, AccessMode.AccessMode_ReadWrite, DeviceType.DeviceType_HardDisk);
            var variants = new MediumVariant[32];
            var i        = 0;

            if (!dyn)
            {
                variants[i++] = MediumVariant.MediumVariant_Fixed;
            }
            if (split && ft == HDFileType.VMDK)
            {
                variants[i] = MediumVariant.MediumVariant_VmdkSplit2G;
            }
            await Client.ProcessProgress(vdi.CloneToBase(newVdi, variants), cancellationToken, progress);
        }