Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

VIRTUALDRIVE - CLASSE DE CRÉATION NON PERSISTANTE ET SUPPRESSION DE LECTEUR VIRTUEL.


Information sur la source

Catégorie :Fichiers / Disque Source .NET ( DotNet ) Classé sous : virtualdrive, lecteur, virtuel Niveau : Initié Date de création : 30/06/2005 Date de mise à jour : 30/06/2005 11:19:28 Vu : 8 815

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

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

  • 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
  • }
  • }
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
	}
}

Historique

30 juin 2005 11:19:28 :
Je m'étais trompé sur une annotation expliquant l'attribution du nom au lecteur virtuel... :)])

Commentaires et avis

signaler à un administrateur
Commentaire de sebmafate le 30/06/2005 14:01:28 administrateur CS

sympa.

signaler à un administrateur
Commentaire de Patrice99 le 01/07/2005 08:46:46

C'est un RAMDrive ?

signaler à un administrateur
Commentaire de aogie le 01/07/2005 08:56:43

Non, la fonction GetDriveType retourne DRIVE_FIXED.

signaler à un administrateur
Commentaire de wizad le 01/07/2005 11:58:31

Juste une question : concretemtn ça sert à quoi?

signaler à un administrateur
Commentaire de aogie le 01/07/2005 14:12:20

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.

signaler à un administrateur
Commentaire de wizad le 01/07/2005 19:50:24

Ah okay merci de cette eclaircissement... je ne voyait vraiment pas les application de cette classe maintenant je saisie plus.

signaler à un administrateur
Commentaire de yfbf le 01/07/2005 22:01:19

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

signaler à un administrateur
Commentaire de aogie le 01/07/2005 22:07:36

Il s'agit à ce moment là d'un lecteur partagé, ce qui n'est pas le cas de cet exemple de lecteur virtuel...

signaler à un administrateur
Commentaire de sebseb42 le 19/07/2005 12:43:06

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

signaler à un administrateur
Commentaire de petermadio le 17/04/2006 20:18:22

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 !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Infos lecteur disque [ par Seb206 ] Comment recuperer des infos sur un lecteur ?Nom du lecteur, type ( disquette, cd, disque dur ...).Avec les classes .net Directory et DirectoryInfo, j' Type de lecteur / support [ par taharban ] Comment reconnaitre le type d'un lecteur, "c:" par exemple ?Pour savoir s'il s'agit d'un disque dur, lecteur CD ou DVD, et même un un CD ou DVD dans l Besoin d'aide pour lecteur video en C# [ par sof_fr ] Bonjour à tous,Je ne vai pas vous bourrer le crane avec 10 000 lignes alors je serai rapide :)J'ai un projet à mener à bien, et je dois programmer une Lecteur CD [ par Online ] Bonjour je suis en train de coder une appli e je voudrais savoir comment faire pour lister UNIQUEMENT les lecteurs CD d'une machine dans une comboboxM lecteur réseau [ par petitou ] Bon voila mon problème, je récupère le chemin d'un répertoire qui se trouve sur un lecteur réseau donc le chemin que je récupère est du type "W:\monRe Lancer une vidéo avec le lecteur par défaut [ par tiju50 ] Bonjour, J'aimerais savoir comment on peut lancer une vidéo style divx en utilisant le lecteur par défaut sous n'importe quel OS. Déjà, est-ce que c'e Mapper un lecteur Reseau [ par ChrisTof ] Bonjour J'aimerai savoir comment faire pour mapper un lecteur réseau en C# sans utiliser : System.Diagnostics.Process.Start("net.exe",@"use b: \\s_ser windows media player [ par godefrw ] Bonjour,Je viens d'installer le service pack 2 sur mon ordi. Evidemment cela a mis à jour windows media player, et apparemment il ne faut plus coder d Comment désactiver l'autostart d'un lecteur window media player? [ par godefrw ] Bonjour, j'ai incorporé un lecteur windows media player dans mon application. J'a le service pack 2 et la mise à jour de windows media player. Je ch Obtenir informations lecteur en c# !!! [ par paulien ] Je recherche déséspérément comment obtenir les informations sur les lecteurs logiques presents dans l'ordinateur, dans un programme c# !!! je precise


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.