Virtualdrive - classe de création non persistante et suppression de lecteur virtuel.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 651 fois - Téléchargée 28 fois

Contenu du snippet

Cette classe permet la création non persistante et la suppression d'un lecteur virtuel.
Celui-ci n'est pas conservé après le redémarrage du système, le nom est le même que le lecteur hébergeant le répertoire donné à la fonction de création.
Le lecteur n'est pas référencé sous la clé : HKLM\System\MountedDevices. (cf. SetVolumeMountPoint)
L'API employée est "DefineDosDevice".
NOTA : le "path" indiqué est pris tel quel car j'emploie le flag "DDD_RAW_TARGET_PATH".
Pour une conversion d'un "path" MS-DOS, ce flag ne doit pas être pris en compte...

Emploi : VirtualDrive.Create('Z', @"C:\WINNT\System32");

Bonne utilisation.

Source / Exemple :


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

namespace AOGie
{
	/// <summary>
	/// Création non persistante et suppression de lecteur virtuel.
	/// Ce lecteur devra donc être recréé après un redémarrage du système.
	/// Celui-ci n'est pas référencé sous la clé : HKLM\System\MountedDevices.
	/// 
	/// AOGie - 30/06/2005.
	/// </summary>
	public class VirtualDrive
	{
		#region Win32

		private const int			DDD_RAW_TARGET_PATH         = 0x00000001;
		private const int			DDD_REMOVE_DEFINITION       = 0x00000002;
		private const int			DDD_EXACT_MATCH_ON_REMOVE   = 0x00000004;

		[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
		private static extern bool DefineDosDevice(
			int dwFlags,
			string lpDeviceName,
			string lpTargetPath
			);

		private const int			DRIVE_UNKNOWN				= 0;
		private const int			DRIVE_NO_ROOT_DIR			= 1;
		private const int			DRIVE_FIXED					= 3;

		[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
		private static extern int GetDriveType(
			string lpRootPathName
			);

		#endregion

		#region Méthodes publiques

		#region Create
		/// <summary>
		/// Création d'un lecteur virtuel non persistant.
		/// </summary>
		/// <param name="driveChar">Lettre à attribuer au lecteur.</param>
		/// <param name="path">Chemin d'accès au répertoire.</param>
		/// <returns>Succès ou échec de l'opération</returns>
		public static bool Create(char driveChar, string path)
		{
			return DDDOperation(driveChar, path, true);
		}
		#endregion

		#region Delete
		/// <summary>
		/// Suppression d'un lecteur virtuel non persistant.
		/// </summary>
		/// <param name="driveChar">Lettre attribuée au lecteur.</param>
		/// <param name="path">Chemin d'accès au répertoire.</param>
		/// <returns>Succès ou échec de l'opération</returns>
		public static bool Delete(char driveChar, string path)
		{
			return DDDOperation(driveChar, path, false);
		}
		#endregion

		#endregion

		#region Méthodes privées

		#region DDDOperation
		private static bool DDDOperation(char driveChar, string path, bool create)
		{
			//répertoire valide ?
			if (!Directory.Exists(path)) return false;

			string drive = string.Format("{0}:", driveChar.ToString().ToUpper());
			//le volume existe ?
			int type = GetDriveType(string.Format("{0}{1}", drive, Path.DirectorySeparatorChar));
			//Nota : un lecteur virtuel est de type DRIVE_FIXED une fois créé.
			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

		#endregion
	}
}

A voir également

Ajouter un commentaire

Commentaires

sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32 -
sympa.
cs_Patrice99
Messages postés
1222
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018
-
C'est un RAMDrive ?
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007
-
Non, la fonction GetDriveType retourne DRIVE_FIXED.
cs_wizad
Messages postés
356
Date d'inscription
samedi 30 octobre 2004
Statut
Membre
Dernière intervention
14 avril 2009
-
Juste une question : concretemtn ça sert à quoi?
aogie
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007
-
Il faut voir ça comme un raccourci vers un répertoire donné. On fait une ou plusieurs opérations sur une racine.

C'est comme quand on crée une connexion vers un lecteur réseau. Après tout, on pourrait très bien à chaque fois rechercher l'ordinateur, ouvrir le partage puis faire les opérations. Ou alors, si on y accède souvent, on crée cette connexion pour avoir un lecteur accessible tout de suite.

Chacun fait son choix.

Mais au cas où, cette classe sans prétention, peut éventuellement rendre service pour qui souhaite créer un lecteur volatile pour une opération donnée.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.