Streamwriter limitation système fichier

Résolu
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 - Modifié par nagashima le 6/11/2013 à 08:24
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 - 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

2 réponses

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
7 nov. 2013 à 11:48
pour info, si le buffer dépasse 4 Ko (d'origine, c'est modifiable), l'exception apparaît.

résolu donc.

naga
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
8 nov. 2013 à 08:50
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
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
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
0
Rejoignez-nous