creating virtual hard Drive

You can use subst command. Use System.Diagnostic.Process to run the subst.exe with desired parameters.

Here is the command syntax:

Syntax

Associates a path with a drive letter.

SUBST [drive1: [drive2:]path] 
SUBST drive1: /D

drive1: Specifies a virtual drive to which you want to assign a path.

[drive2:]path Specifies a physical drive and path you want to assign to a virtual drive.

/D Deletes a substituted (virtual) drive.

Type SUBST with no parameters to display a list of current virtual drives.list of current virtual drives.


Here is C# code to do this directly:

using System;
using System.Text;
using System.ComponentModel;
using System.Runtime.InteropServices;

static class Subst {
    public static void MapDrive(char letter, string path) {
        if (!DefineDosDevice(0, devName(letter), path))
            throw new Win32Exception();
    }
    public static void UnmapDrive(char letter) {
        if (!DefineDosDevice(2, devName(letter), null))
            throw new Win32Exception();
    }
    public static string GetDriveMapping(char letter) {
        var sb = new StringBuilder(259);
        if (QueryDosDevice(devName(letter), sb, sb.Capacity) == 0) {
            // Return empty string if the drive is not mapped
            int err = Marshal.GetLastWin32Error();
            if (err == 2) return "";
            throw new Win32Exception();
        }
        return sb.ToString().Substring(4);
    }


    private static string devName(char letter) {
        return new string(char.ToUpper(letter), 1) + ":";
    }
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool DefineDosDevice(int flags, string devname, string path);
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int QueryDosDevice(string devname, StringBuilder buffer, int bufSize);
}

Sample usage:

        Subst.MapDrive('z', @"c:\temp");
        Console.WriteLine(Subst.GetDriveMapping('z'));
        Subst.UnmapDrive('z');

Do it the exact same way you would map a network drive, but point it to a folder on the current machine. The only thing you have to do special is use a UNC path for the local folder.

Here is a helper class

Tags:

C#