Streamwriter limitation système fichier [Résolu]

Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
-
Bonjour à tous,
J'ai un problème lors de l'écriture sur un gros fichier. Mon application à pour rôle de concaténer deux gros fichiers (>20Go) en retirant les doublons.

Tout se passe correctement jusqu'à ce que le fichier soit devenue assez gros (entre 3.5Go et 4Go), et là j'ai une exception :

Impossible de terminer l opération demandée du fait d'une limitation du système de fichiers.


Le code de la fonction qui se charge de l'écriture est :

private void Ecrire(string sLigne)
{
using(StreamWriter sw = new StreamWriter(sFicDest,true,Encoding.UTF8))
{
sw.WriteLine(sLigne);
}
}


Quelqu'un aurai une idée ?

Pour info, je suis sous un système 64bits, sur un disque en ntfs.

naga
Afficher la suite 

Votre réponse

2 réponses

Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
0
Merci
pour info, si le buffer dépasse 4 Ko (d'origine, c'est modifiable), l'exception apparaît.

résolu donc.

naga
Commenter la réponse de nagaD.scar
Messages postés
788
Date d'inscription
mardi 8 juillet 2003
Dernière intervention
8 mars 2017
0
Merci
Bonjour,
tu as mis résolu, mais il serait bien que tu sois un peu plus précis pour que les gens qui consulteront ta question puissent trouver leur réponse.
merci et bon codage
nagaD.scar
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
-
salut, je l'ai fait en précisant que si le buffer dépasse les 4Koo, soit 4096 caractères, l'exception apparaît. Il se trouve que c'est une erreur dans la classe StreamWriter , avec la fonction d'écriture, où l'exception n'est ni gérée, ni affichée.

Pour ma part, plutot qu'agrandir le buffer, ce qui ferai prendre plus de temps à mon appli, j'ai fais une méthode d'ecriture avec la classe FileStream :
private long Write(string s, long iPos)
{
FileStream fs = new FileStream(sFicDest, FileMode.Open, FileAccess.ReadWrite);
fs.Position = iPos;
for (int i = 0; i < s.Length; i++)
{
try
{
if (i >= 4090) throw new Exception();
char c = s[i];
fs.WriteByte((byte)c);

if (i + 1 == s.Length) fs.WriteByte((byte)'\r');
if(i+1==s.Length) fs.WriteByte((byte)'\n');
}
catch (Exception)
{
iPos = fs.Position - 1;
fs.Flush();
fs.Dispose();
string rest = "";
for (; i < s.Length; i++)
rest += s[i];
return Write(rest, iPos);
}
}
iPos = fs.Position;
fs.Dispose();
return iPos;
}


la position de mon curseur étant gérer "plus haut".
naga
Commenter la réponse de cs_louis14

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.