Feedback

C# - Erstellung eines virtuellen Laufwerks

Veröffentlicht von am 29.11.2007
(19 Bewertungen)
Mit der von mir erstellen Klasse, kann man ein nicht persistentes virtuelles Laufwerk erstellen. Anbei ein Beispiel wie man ein Laufwerk erstellt/löscht.

Laufwerk erstellen:
TL.Drive.VirtualDrive.Create('Z', @"C:\Musiksammlung");

Laufwerk löschen:
TL.Drive.VirtualDrive.Delete('Z', @"C:\Musiksammlung");
/*
 * VirtualDrive - Erstellung/Löschung von virtuellen Laufwerken
 * ------------------------------------------------------------
 * Version: 1.0
 * Copyright © 2007 Konstantin Gross
 * http://www.texturenland.de
 *
*/

using System;
using System.IO;
using System.Runtime.InteropServices;

namespace TL.Drive
{
    /// <summary>
    /// Erstellung und Löschung nicht persistenter virtueller Laufwerke.
    /// Das Laufwerk muss nach jedem Neustart des Systems wiederhergestellt werden.
    /// Wird nicht unter dem Registryschlüssel angezeigt : HKLM\System\MountedDevices.
    /// 
    /// VirtualDrive - © Konstantin Gross
    /// </summary>
    public class VirtualDrive
    {
        #region Win32
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern bool DefineDosDevice(
            int dwFlags,
            string lpDeviceName,
            string lpTargetPath
            );

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern int GetDriveType(
            string lpRootPathName
            );
        
        private const int DDD_RAW_TARGET_PATH = 0x00000001;
        private const int DDD_REMOVE_DEFINITION = 0x00000002;
        private const int DDD_EXACT_MATCH_ON_REMOVE = 0x00000004;
        
        private const int DRIVE_UNKNOWN = 0;
        private const int DRIVE_NO_ROOT_DIR = 1;
        private const int DRIVE_FIXED = 3;        
        #endregion // Win32

        #region Öffentliche Methoden        
        
        #region Erstellen
        /// <summary>
        /// Erstellung eines nicht persistenten Laufwerks.
        /// </summary>
        /// <param name="driveChar">Laufwerksbuchstabe.</param>
        /// <param name="path">Pfad zu dem zu verknüpfenden Ordner.</param>
        /// <returns>True/False beim Versuch das Laufwerk zu erstellen</returns>
        public static bool Create(char driveChar, string path)
        {
            return DDDOperation(driveChar, path, true);
        }
        #endregion // Erstellen

        #region Löschen
        /// <summary>
        /// Löschung eines nicht persistenten Laufwerks.
        /// </summary>
        /// <param name="driveChar">Laufwerksbuchstabe.</param>
        /// <param name="path">Pfad zu dem zu verknüpfenden Ordner.</param>
        /// <returns>True/False beim Versuch das Laufwerk zu löschen</returns>
        public static bool Delete(char driveChar, string path)
        {
            return DDDOperation(driveChar, path, false);
        }
        #endregion // Löschen

        #endregion // Öffentliche Methoden

        #region Private Methoden
        
        #region DDDOperationen
        private static bool DDDOperation(char driveChar, string path, bool create)
        {
            //Gültiges Verzeichnis?
            if (!Directory.Exists(path))
                return false;

            string drive = string.Format("{0}:", driveChar.ToString().ToUpper());
            
            //Existiert das Volumen?
            int type = GetDriveType(string.Format("{0}{1}", drive, Path.DirectorySeparatorChar));

            //Hinweiß: Ein erstelltes virtuelles Laufwerk ist vom Typ DRIVE_FIXED
            if ((create && type != DRIVE_UNKNOWN && type != DRIVE_NO_ROOT_DIR) ||
                (!create && type != DRIVE_FIXED))
                return false;

            int flags = DDD_RAW_TARGET_PATH;

            if (!create) flags |= (DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE);
            return DefineDosDevice(
                flags,
                drive,
                string.Format("{0}??{0}{1}", Path.DirectorySeparatorChar, path)
                );
        }
        #endregion // DDDOperationen

        #endregion // Private Methoden
    }
}

4 Kommentare zum Snippet

Krzysztof schrieb am 02.11.2009:
das habe ich gesucht.
Von mir hast Du 10 Pkt.
Nille schrieb am 21.01.2011:
Ich hab mal ne Frage :

Gibt es ne Möglichkeit den Namen für das erstellte Laufwerk festzulegen ?

Sonst echt super :)
Hans schrieb am 24.08.2011:
Was nützt das schönste Snippet, wenn ein Copyright daran hängt. Widerspricht sich mit dem Community Gedanken? Oder bin ich hier auf einer Marketingplattform gelandet?
Konstantin Gross schrieb am 29.08.2011:
@Hans:
Das Copyright kannst du ignorieren. Ich hab lange Zeit jedem Snippet von mir, das Copyright angehängt. Es ist lediglich eine Information von wem das Snippet stammt.
 

Logge dich ein, um hier zu kommentieren!