Pytanie zadane w tytule tego posta, to drugie z trudniejszych pytań jakie pojawiło się podczas mojej sesji o plikach na portalu VirtualStudy.
Przeszukałem trochę sieć i okazało się, że folder można w dość prosty sposób udostępnić za pomocą WMI – Windows management Instrumentation – które w .NET reprezentowane jest przez przestrzeń nazw System.Management.
Aby udostępnić folder wystarczy przekazać odpowiednie parametry do klasy Win32_Share i wywołać metodę Create.

public static void Share(string path, string shareName, string description)
{
    var managementClass = new ManagementClass(“Win32_Share”);
    ManagementBaseObject parameters = managementClass.GetMethodParameters(“Create”);
    parameters[“Description”] = description;
    parameters[“Name”] = shareName;
    parameters[“Path”] = path;
    parameters[“Type”] = 0;
    ManagementBaseObject outs = managementClass.InvokeMethod(“Create”, parameters, null);
    if (outs == null || ((uint)(outs.Properties[“ReturnValue”].Value) != 0))
    {
        throw new IOException(“Unable to share directory.”);
    }
}

Co tutaj się dzieje? Na początku pobieramy klasę Win32_Share, a następnie tworzymy obiekt reprezentujący parametry, które będę przekazywane do polecenia Create. Wypełniamy je odpowiednimi danymi (nie są to wszystkie parametry, które możemy przekazać/ustawić – pełna lista tu). Następnie wołamy tę metodę przekazując obiekt parametrów. Na koniec sprawdzamy czy operacja się udała (zwróciła 0; pełna lista błędów w linku poprzednim). Jeśli wszystko się powiodło, nasz folder zostanie udostępniony pod nazwą, którą przekazaliśmy w parametrze shareName. Aby taki udostępniony folder usunąć wystarczy wykonać polecenie Delete, na konkretnym udostępnionym folderze.

public static void Unshare(string shareName)
{
    var managementObject = new ManagementObject(string.Format(“Win32_Share.Name='{0}'”, shareName));
    try
    {
        managementObject.InvokeMethod(“Delete”, null, null);
    }
    catch (ManagementException ex)
    {
        throw new IOException(“Unable to unshare folder”, ex);
    }
}

Wyszukujemy nasz udostępniony folder na podstawie nazwy pod jaką jest udostępniony i wywołujemy na nim metodę Delete. Proste.
Możemy dodatkowo umieścić wywołanie takich metod jako Extension Method na klasie DirectoryInfo.

public static void Share(this DirectoryInfo dir, string shareName, string description)
{
    ShareFolder.Share(dir.FullName, shareName, description);
}
public static void Unshare(this DirectoryInfo dir, string shareName)
{
    ShareFolder.Unshare(shareName);

Użycie tego wszystkiego jest jeszcze prostsze.

DirectoryInfo directoryInfo = new DirectoryInfo(@”C:\Users\pawlos\Documents\”);
directoryInfo.Share(“Dokumenty”, “Udostępnione dokumenty”);
directoryInfo.Unshare(“Dokumenty”);

I gotowe. Miłego kodowania.