Accueil > > > [.NET2] FAIRE UNE IMAGE ISO D'UN CD/DVD
[.NET2] FAIRE UNE IMAGE ISO D'UN CD/DVD
Information sur la source
Description
C'est juste une traduction de la traduction en C de Vecchio56 d'une source écrit par BruNews en assembleur Vous trouvez l'original ici: http://www.asmfr.com/codes/FAIRE-FICHIER-ISO- MASM32_22635.aspx Sa traduction en C: http://www.cppfrance.com/codes/FAIRE-FICHIER-IS O-WIN32_37943.aspx Informations: Windows 2000 ou supérieur requis. Fait un fichier Iso9660 depuis un CD ou DVD. On peut stopper pendant l'opération. Les CDs musique non pris en charge. La source est commentée, assez simple à comprendre :)
Source
- using System;
- using System.IO;
- using System.Threading;
- using System.Runtime.InteropServices;
- using Microsoft.Win32.SafeHandles;
-
- namespace Iso9660
- {
- public class Iso9660
- {
-
- #region 'Variables'
-
- Thread _thIso;
- string _output;
- long _cdsize;
- FileStream _fsr;
- FileStream _fsw;
- SafeFileHandle _hdev;
-
- #endregion
-
-
- #region 'Constantes'
-
- const int BUFFER_SIZE = 0x20000; //128ko taille des blocs de copie
- const long FAT32_LIMIT = 4294967296; //4go taille max. d'un fichier sur FAT32
-
- #endregion
-
-
- #region 'Evénement'
-
- /// <summary>Indique la progression.</summary>
- public event Iso9660EventHandler OnProgress;
- /// <summary>Se déclenche lors d'un message pendant la création.</summary>
- public event Iso9660EventHandler OnMessage;
- /// <summary>Se déclenche quand l'image est créée.</summary>
- public event Iso9660EventHandler OnFinish;
-
- #endregion
-
-
- #region 'Propriété'
-
- /// <summary>
- /// Retourne la taille en octets du CD.
- /// </summary>
- public long SizeOfCD
- {
- get { return _cdsize; }
- }
-
- #endregion
-
-
- #region 'Constructeur'
-
- /// <summary>
- /// Constructeur.
- /// </summary>
- public Iso9660()
- {
- _thIso = null;
- _output = @"C:\MyCd.iso";
- }
-
- #endregion
-
-
- #region 'Méthodes'
-
- /// <summary>
- /// Créer une image ISO9660 d'un cd/dvd.
- /// </summary>
- /// <param name="source">Lecteur cd/dvd.</param>
- /// <param name="output">Fichier iso de sortie.</param>
- /// <returns>1 = Création de l'image en cours.
- /// -1 = Handle du lecteur invalide.
- /// -2 = La source n'est pas un cd/dvd.
- /// -3 = Espace disque insuffisant pour la création de l'image.
- /// -4 = Volume de destination FAT32 et taille de la source > 4 096 Mo.</returns>
- public int MakeIsoFromCD(string source, string output)
- {
- //Source CD/DVD
- if (new DriveInfo(source).DriveType != DriveType.CDRom) return -2;
-
- //récupérer taille du cd
- _cdsize = CDLenght(source);
-
- //vérif espace disque
- long hddsize = new DriveInfo(Path.GetPathRoot(output)).AvailableFreeSpace;
- if (hddsize <= _cdsize) return -3;
-
- //Test capacité > 4 096 Mo (partition NTFS)
- if (!IsNTFS(output) & _cdsize >= FAT32_LIMIT) return -4;
-
- //Ouverture
- _hdev = NativeMethods.CreateFileR(source);
- if (output != "") _output = output;
-
- //Si handle invalide ou fermé
- if (_hdev.IsClosed | _hdev.IsInvalid) return -1;
-
- //Création thread pour copie + Démarrage
- _thIso = new Thread(new ThreadStart(ThProcIso));
- _thIso.Start();
-
- return 1;
- }
-
- /// <summary>
- /// Arrete la création de l'image.
- /// (+ Supprime l'image créer)
- /// </summary>
- public void Stop()
- {
- _thIso.Abort();
-
- CloseAll();
-
- if (File.Exists(_output)) File.Delete(_output);
-
- if (OnMessage != null)
- {
- EventIso9660 e = new EventIso9660(@"Création de l'image annulée");
- OnMessage(e);
- }
- }
-
- /// <summary>
- /// Méthode - C'est ici que l'ont crée l'image iso9660.
- /// </summary>
- private void ThProcIso()
- {
- System.Diagnostics.Stopwatch chrono = new System.Diagnostics.Stopwatch();
- chrono.Start();
-
- try
- {
- _fsr = new FileStream(_hdev, FileAccess.Read, BUFFER_SIZE);
- _fsw = new FileStream(_output, FileMode.Create, FileAccess.Write, FileShare.None, BUFFER_SIZE);
-
- byte[] buffer = new byte[BUFFER_SIZE];
-
- //Lecture des blocs de données du volume -> écriture des blocs dans le fichier iso
- do
- {
- _fsr.Read(buffer, 0, BUFFER_SIZE);
- _fsw.Write(buffer, 0, BUFFER_SIZE);
-
- if (OnProgress != null)
- {
- EventIso9660 e = new EventIso9660(_fsw.Position);
- OnProgress(e);
- }
-
- } while (_fsw.Position == _fsr.Position);
- }
- catch (Exception ex)
- {
- //En cas d'erreur.
- if (OnMessage != null)
- {
- EventIso9660 e = new EventIso9660("Erreur pendant la création de l'image: " + ex.Message);
- OnMessage(e);
- }
- }
- finally
- {
- CloseAll();
-
- if (OnFinish != null)
- {
- EventIso9660 e = new EventIso9660(chrono.Elapsed);
- OnFinish(e);
- }
- }
- }
-
- /// <summary>
- /// Ferme les flux + handles et libère les ressources utilisées.
- /// </summary>
- private void CloseAll()
- {
- //Ferme les flux sur les 2 fichiers et libère les ressources utilisées.
- _fsr.Close();
- _fsw.Close();
-
- //Marque le handle et libère les ressources utilisées.
- _hdev.Close();
- _hdev.Dispose();
- }
-
- /// <summary>
- /// Taille du cd/dvd.
- /// </summary>
- /// <param name="drive">Lecteur source.</param>
- /// <returns>Taille en octets.</returns>
- private long CDLenght(string drive)
- {
- return new DriveInfo(drive).TotalSize;
- }
-
- /// <summary>
- /// Indique si système de fichiers du volume est NTFS.
- /// </summary>
- /// <param name="destination">Image ISO de sortie.</param>
- /// <returns>True si NTFS.</returns>
- private bool IsNTFS(string destination)
- {
- return new DriveInfo(Path.GetPathRoot(destination)).DriveFormat == "NTFS" ? true : false;
- }
-
- #endregion
-
- }
- }
using System;
using System.IO;
using System.Threading;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
namespace Iso9660
{
public class Iso9660
{
#region 'Variables'
Thread _thIso;
string _output;
long _cdsize;
FileStream _fsr;
FileStream _fsw;
SafeFileHandle _hdev;
#endregion
#region 'Constantes'
const int BUFFER_SIZE = 0x20000; //128ko taille des blocs de copie
const long FAT32_LIMIT = 4294967296; //4go taille max. d'un fichier sur FAT32
#endregion
#region 'Evénement'
/// <summary>Indique la progression.</summary>
public event Iso9660EventHandler OnProgress;
/// <summary>Se déclenche lors d'un message pendant la création.</summary>
public event Iso9660EventHandler OnMessage;
/// <summary>Se déclenche quand l'image est créée.</summary>
public event Iso9660EventHandler OnFinish;
#endregion
#region 'Propriété'
/// <summary>
/// Retourne la taille en octets du CD.
/// </summary>
public long SizeOfCD
{
get { return _cdsize; }
}
#endregion
#region 'Constructeur'
/// <summary>
/// Constructeur.
/// </summary>
public Iso9660()
{
_thIso = null;
_output = @"C:\MyCd.iso";
}
#endregion
#region 'Méthodes'
/// <summary>
/// Créer une image ISO9660 d'un cd/dvd.
/// </summary>
/// <param name="source">Lecteur cd/dvd.</param>
/// <param name="output">Fichier iso de sortie.</param>
/// <returns>1 = Création de l'image en cours.
/// -1 = Handle du lecteur invalide.
/// -2 = La source n'est pas un cd/dvd.
/// -3 = Espace disque insuffisant pour la création de l'image.
/// -4 = Volume de destination FAT32 et taille de la source > 4 096 Mo.</returns>
public int MakeIsoFromCD(string source, string output)
{
//Source CD/DVD
if (new DriveInfo(source).DriveType != DriveType.CDRom) return -2;
//récupérer taille du cd
_cdsize = CDLenght(source);
//vérif espace disque
long hddsize = new DriveInfo(Path.GetPathRoot(output)).AvailableFreeSpace;
if (hddsize <= _cdsize) return -3;
//Test capacité > 4 096 Mo (partition NTFS)
if (!IsNTFS(output) & _cdsize >= FAT32_LIMIT) return -4;
//Ouverture
_hdev = NativeMethods.CreateFileR(source);
if (output != "") _output = output;
//Si handle invalide ou fermé
if (_hdev.IsClosed | _hdev.IsInvalid) return -1;
//Création thread pour copie + Démarrage
_thIso = new Thread(new ThreadStart(ThProcIso));
_thIso.Start();
return 1;
}
/// <summary>
/// Arrete la création de l'image.
/// (+ Supprime l'image créer)
/// </summary>
public void Stop()
{
_thIso.Abort();
CloseAll();
if (File.Exists(_output)) File.Delete(_output);
if (OnMessage != null)
{
EventIso9660 e = new EventIso9660(@"Création de l'image annulée");
OnMessage(e);
}
}
/// <summary>
/// Méthode - C'est ici que l'ont crée l'image iso9660.
/// </summary>
private void ThProcIso()
{
System.Diagnostics.Stopwatch chrono = new System.Diagnostics.Stopwatch();
chrono.Start();
try
{
_fsr = new FileStream(_hdev, FileAccess.Read, BUFFER_SIZE);
_fsw = new FileStream(_output, FileMode.Create, FileAccess.Write, FileShare.None, BUFFER_SIZE);
byte[] buffer = new byte[BUFFER_SIZE];
//Lecture des blocs de données du volume -> écriture des blocs dans le fichier iso
do
{
_fsr.Read(buffer, 0, BUFFER_SIZE);
_fsw.Write(buffer, 0, BUFFER_SIZE);
if (OnProgress != null)
{
EventIso9660 e = new EventIso9660(_fsw.Position);
OnProgress(e);
}
} while (_fsw.Position == _fsr.Position);
}
catch (Exception ex)
{
//En cas d'erreur.
if (OnMessage != null)
{
EventIso9660 e = new EventIso9660("Erreur pendant la création de l'image: " + ex.Message);
OnMessage(e);
}
}
finally
{
CloseAll();
if (OnFinish != null)
{
EventIso9660 e = new EventIso9660(chrono.Elapsed);
OnFinish(e);
}
}
}
/// <summary>
/// Ferme les flux + handles et libère les ressources utilisées.
/// </summary>
private void CloseAll()
{
//Ferme les flux sur les 2 fichiers et libère les ressources utilisées.
_fsr.Close();
_fsw.Close();
//Marque le handle et libère les ressources utilisées.
_hdev.Close();
_hdev.Dispose();
}
/// <summary>
/// Taille du cd/dvd.
/// </summary>
/// <param name="drive">Lecteur source.</param>
/// <returns>Taille en octets.</returns>
private long CDLenght(string drive)
{
return new DriveInfo(drive).TotalSize;
}
/// <summary>
/// Indique si système de fichiers du volume est NTFS.
/// </summary>
/// <param name="destination">Image ISO de sortie.</param>
/// <returns>True si NTFS.</returns>
private bool IsNTFS(string destination)
{
return new DriveInfo(Path.GetPathRoot(destination)).DriveFormat == "NTFS" ? true : false;
}
#endregion
}
}
Conclusion
Voila, A vos notes et commentaires :)
++
Historique
- 06 juin 2006 11:47:18 :
- arf ! oublie de la capture !
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
traitement d'images avec C# [ par ingensi ]
j'ai besoin de votre aide svp [^^sad1] j'ai un projet à faire et à rendre au début de la prochaine année universitaire. ce projet consiste principalem
Déformation en trapèze d'une image [ par SnakeHunter221298 ]
Bonjour, Je dois créer un programme qui me permet d'intégrer une image dans une autre. pour rendre le rendu plus réaliste j'aurai besoin d'un code qui
Inser une image dans une cellule c1TrueDBGrid [ par twaita ]
Comment inserer une image dans une cellule c1truDBGrid et effectuer un evennement à elle? SP très urgent et merci d'avance :)
Probleme pour Libérer les ressources d'une image en fond de canvaslors de la sauvegarde [ par jerome_ ]
Bonjour, Je développe une appli en C# WPF sous win 7. J'ai mis une image à l'intérieur d'un canvas afin d'y dessiner dessus et enregistrer l'image
Application console - Detail Image windows 7 [ par Djzlouk ]
Bonjour, J'ai une appli console ou j'aimerais récupérer toutes les infos d'une image, es possible ? Les tags, la notation, l'appareil qui a prit la
pointeur rawdata bitmap [ par gearmat ]
Bonjour Bonjour j'aurais besoin de votre aide pour la classe bitmap :) j'ai une dll coder en c++ de traitement d'image qui me demande en paramètre u
coordonée clique souris [ par chasseurdedemon ]
bonjour, J'ai besoin pour mon programme de connétre les coordoné de la souris lor d'un clique . exemple : j'ai une image lors d'un clique sur l'imag
Bandeau d'image(cliquable) dans un formulaire Winform [ par partales ]
bonjour, Je cherche à faire une sorte de bandeau d'image cliquable dans un formulaire. Seulement, j'aurais souhaité pouvoir le courber (le bandeau) d
Découper une image en WPF [ par xmox667 ]
Salut à tous, Qui saurait comment on découpe une image comme un puzzle en wpf ? Merci
|
Derniers Blogs
COMMENT UTILISER MVVM AVEC WINDOWS FORMSCOMMENT UTILISER MVVM AVEC WINDOWS FORMS par sebmafate
Ceux qui me connaissent depuis longtemps savent à quel point j'aime Windows Forms. Mais depuis l'arrivée de Silverlight et WPF, je boude régulièrement cette API car il n'est pas toujours facile de faire les choses proprement. Je me suis donc lan...
Cliquez pour lire la suite de l'article par sebmafate [SETUP] TU REBOOT OU TU REBOOT PAS?[SETUP] TU REBOOT OU TU REBOOT PAS? par JeremyJeanson
Quand on fournit une application à déployer, il y a souvent une grave question à laquelle personne n'a pensé : Après déploiement, l'OS va-t-il avoir besoin de redémarrer? En fonction des environnements, cette question est plus ou moins importante. Dans un...
Cliquez pour lire la suite de l'article par JeremyJeanson NOUVEAU BLOGNOUVEAU BLOG par Audrey
Vous pouvez désormais me suivre sur mon nouveau blog : http://blogs.msdn.com/b/audrey A bientôt !...(read more) ...
Cliquez pour lire la suite de l'article par Audrey BIENVENUE SUR LE BLOG DE MAKE A SIGN !BIENVENUE SUR LE BLOG DE MAKE A SIGN ! par junarnoalg
Qui est Make a Sign ? http://www.mytic.be/IC2012 "Make a Sign" est une équipe de 3 étudiants en informatique qui ont choisi de vivre une expérience particulière. Plutôt que de faire un stage traditionnel en entreprise, ils ont décidé de part...
Cliquez pour lire la suite de l'article par junarnoalg [SHAREPOINT] ARRêTER L'ACTIVATION D'UNE FEATURE DEPUIS UN EVENT RECEIVER[SHAREPOINT] ARRêTER L'ACTIVATION D'UNE FEATURE DEPUIS UN EVENT RECEIVER par Pierrick CATRO-BROUILLET
Les Features sont la pierre angulaire de pratiquement tous nos développements SharePoint pour en contrôler le déploiement et le retrait. Parfois, on veut pouvoir interdire leur activation si des contraintes ne sont pas satisfaites et on peut y arriver...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET
Logiciels
Share alpha Powered by BitTorrent (2012)SHARE ALPHA POWERED BY BITTORRENT (2012)BitTorrent est un service bien connu des amateurs de réseaux décentralisés et d'échanges de fichi... Cliquez pour télécharger Share alpha Powered by BitTorrent BitTorrent Live (2012)BITTORRENT LIVE (2012)BitTorrent Live est un réseau peer-to-peer nouveau live protocole de streaming actuellement en dé... Cliquez pour télécharger BitTorrent Live Easy-Planning (1.1.0.2)EASY-PLANNING (1.1.0.2)Easy-Planning permet de créer des plannings sous la représentation de diagrammes. Easy-Planning p... Cliquez pour télécharger Easy-Planning DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler
|