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

0/5 (11 avis)

Snippet vu 14 668 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

Toxic64
Messages postés
13
Date d'inscription
jeudi 13 novembre 2008
Statut
Membre
Dernière intervention
25 juin 2009

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

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

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

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

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.