Programmation C sharp/Entrées-sorties
Les fonctions d'entrées-sorties utilisent l'espace de nom System.IO
.
La classe Stream
modifier
La classe abstraite Stream
possède des méthodes permettant à la fois de lire et d'écrire. Cependant, l'écriture ou la lecture peut ne pas être autorisée (fichier en lecture seule, ...).
Propriétés
modifierLa classe Stream
possède les propriétés suivantes :
bool CanRead
- (lecture seule) Cette propriété vaut
true
quand la lecture est possible. bool CanWrite
- (lecture seule) Cette propriété vaut
true
quand l'écriture est possible. bool CanSeek
- (lecture seule) Cette propriété vaut
true
quand le positionnement dans le flux est possible (méthodeSeek
ou propriétéPosition
). bool CanTimeout
- (lecture seule) Cette propriété vaut
true
quand le flux peut expirer (fin de connexion pour une socket, ...). long Length
- (lecture seule) Longueur du flux en nombre d'octets.
long Position
- Position courante dans le flux en nombre d'octets depuis le début.
int ReadTimeout
- Temps imparti pour la méthode
Read
, en millisecondes. L'accès à cette propriété peut déclencher le lancement d'une exception de typeInvalidOperationException
si la fonctionnalité n'est pas supportée. int WriteTimeout
- Temps imparti pour la méthode
Write
, en millisecondes. L'accès à cette propriété peut déclencher le lancement d'une exception de typeInvalidOperationException
si la fonctionnalité n'est pas supportée.
Méthodes
modifierLes méthodes de la classe Stream
sont les suivantes :
void Close()
- Ferme le flux.
void Dispose()
- Libère les ressources occupées par le flux.
void Flush()
- Cette méthode vide les buffers d'écriture vers le support associé (fichier, socket, ...).
int ReadByte()
- Cette méthode lit un octet et retourne sa valeur, ou -1 en cas d'erreur.
void WriteByte(byte value)
- Cette méthode écrit un octet.
int Read(byte[] buffer, int offset, int count)
- Cette méthode lit
count
octets dans le buffer spécifié, à partir de l'offsetoffset
dans le tableaubuffer
. Elle retourne le nombre d'octets effectivement lus. void Write(byte[] buffer, int offset, int count)
- Cette méthode écrit
count
octets du tableaubuffer
dont le premier octet est situé à l'offsetoffset
. void Seek(long offset, SeekOrigin origin)
- Déplace le pointeur d'écriture/lecture de offset octets depuis l'origine indiquée:
SeekOrigin.Begin
: depuis le début du flux,SeekOrigin.End
: à partir de la fin du flux,SeekOrigin.Current
: à partir de la position courante dans le flux.
void SetLength(long value)
- Cette méthode modifie la longueur totale du flux (troncature ou remplissage avec des octets nuls).
Méthodes asynchrones
modifierLes méthodes Read
et Write
utilisant un tableau d'octet existent également en version asynchrone :
IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback, object)
.int EndRead(IAsyncResult result)
.IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback, object)
.void EndWrite(IAsyncResult result)
.
Membres statiques
modifierLa classe Stream
possède également deux membres statiques :
- La constante
Null
est un flux dont la lecture ou l'écriture ne produit aucun effet. - La méthode statique
Synchronized
retourne une version synchronisée du flux passé en paramètre.
Fonctions asynchrones
modifierLes fonctions dont le retour peut prendre du temps existent également en version asynchrone. La méthode appelée est alors celle dont le nom commence par Begin
. Elle demande au pool de threads standard d'exécuter l'opération. Une fois l'opération terminée, le delegate passé à la fonction Begin
doit appeler la fonction End
correspondante pour récupérer le résultat.
Exemple
modifierCet exemple utilise la version asynchrone de la méthode Read
de la classe Stream
.
class LectureAsync
{
private byte[] buffer = new byte[4000];
public void commencerLecture(Stream s)
{
// Commencer la lecture
IAsyncResult iar = s.BeginRead(buffer, 0, buffer.length, finLecture, s);
// et retour immédiat
// La méthode finLecture transmise en 4ème paramètre sera appelée
// quand la lecture du tableau d'octets sera terminée.
}
public void finLecture(IAsyncResult result) //AsyncCallback
{
// Stream : le dernier argument transmis à BeginRead
Stream s=(Stream)result.AsyncState;
// récupérer le nombre d'octets lus
int nb_octets = s.EndRead(result);
}
}
Flux de fichier
modifierLa classe FileStream
dérive de la classe Stream
. Elle possède donc les mêmes méthodes.
La classe FileStream
possède les constructeurs suivants :
public FileStream(string path, System.IO.FileMode mode,
[ System.IO.FileAccess access,
[ System.IO.FileShare share,
[ int bufferSize,
[ System.IO.FileOptions options ] ] ] ] );
public FileStream(string path, System.IO.FileMode mode,
[ System.IO.FileAccess access,
[ System.IO.FileShare share,
[ int bufferSize,
[ bool useAsync ] ] ] ] );
public FileStream(string path, System.IO.FileMode mode,
System.Security.AccessControl.FileSystemRights rights,
System.IO.FileShare share,
int bufferSize, System.IO.FileOptions options,
[ System.Security.AccessControl.FileSecurity fileSecurity ] );
Les crochets indiquent les paramètres optionnels.