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

0/5 (11 avis)

Snippet vu 15 331 fois - Téléchargée 30 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
Toxic64 Messages postés 13 Date d'inscription jeudi 13 novembre 2008 Statut Membre Dernière intervention 25 juin 2009
19 juin 2009 à 21:45
Salut,

Certains vont trouver cela bete mais je ne comprend pas pourquoi 100 lignes de code alors que la commande "SUBST" en DOS fait la même chose exactement...

pour reprendre ton exemple:

"subst Z: c:\windows\system32"

Travaillant pour ma part réguilierement avec MICROSOFT (dans une entreprise partenare), je doute serieusement de leur aptitudeasimplifier les choses...

Bel effort tout de même....

++
petermadio Messages postés 30 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 24 décembre 2011
17 avril 2006 à 20:18
Salut !
Je voudrais savoir les codes qui peuvent permettre de garder le disque virtuel en redemarant l'ordinateur ? Quels sont les modifications à effectuer sur ton code.
Merci !
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
19 juil. 2005 à 12:43
ca ne fonctionne que pour binder un dossier vers un disque virtuel ? ou est-ce qu'on peut creer un disque virtuel et avoir full-access pour en faire autre chose ? par exemple masquer un montage FTP derriere :) je cherche a faire ce genre de choses depuis pas mal de temps mais je n'ai encore rien trouver... donc au passage si quelqu'un a des infos, je suis preneur, merci
aogie Messages postés 108 Date d'inscription vendredi 11 juillet 2003 Statut Membre Dernière intervention 27 novembre 2007
1 juil. 2005 à 22:07
Il s'agit à ce moment là d'un lecteur partagé, ce qui n'est pas le cas de cet exemple de lecteur virtuel...
yfbf Messages postés 21 Date d'inscription dimanche 15 février 2004 Statut Membre Dernière intervention 11 janvier 2008
1 juil. 2005 à 22:01
Comment procéder pour accéder à un répertoire d'un PC où il faut mettre un username et password avec votre composant qui est fort interessant

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.