Streamwriter limitation système fichier [Résolu]

nagaD.scar 4269 Messages postés samedi 8 septembre 2007Date d'inscription 29 août 2018 Dernière intervention - 6 nov. 2013 à 08:08 - Dernière réponse : nagaD.scar 4269 Messages postés samedi 8 septembre 2007Date d'inscription 29 août 2018 Dernière intervention
- 8 nov. 2013 à 09:29
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

3 réponses

nagaD.scar 4269 Messages postés samedi 8 septembre 2007Date d'inscription 29 août 2018 Dernière intervention - 7 nov. 2013 à 11:48
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
cs_louis14 788 Messages postés mardi 8 juillet 2003Date d'inscription 8 mars 2017 Dernière intervention - 8 nov. 2013 à 08:50
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 4269 Messages postés samedi 8 septembre 2007Date d'inscription 29 août 2018 Dernière intervention - 8 nov. 2013 à 09:29
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.