J'ai la belle tâche de déterminer comment gérer les gros fichiers chargés dans l'éditeur de script de notre application (c'est comme VBA pour notre produit interne pour les macros rapides). La plupart des fichiers pèsent entre 300 et 400 Ko, ce qui est un chargement correct. Mais lorsqu'ils dépassent les 100 Mo, le processus est difficile (comme vous vous en doutez).
Ce qui se passe, c'est que le fichier est lu et poussé dans un RichTextBox qui est ensuite parcouru - ne vous inquiétez pas trop de cette partie.
Le développeur qui a écrit le code initial utilise simplement un StreamReader et fait
[Reader].ReadToEnd()
ce qui pourrait prendre un certain temps.
Ma tâche est de casser ce morceau de code, de le lire en morceaux dans un tampon et d'afficher une barre de progression avec une option pour l'annuler.
Quelques hypothèses:
- La plupart des fichiers auront entre 30 et 40 Mo
- Le contenu du fichier est du texte (non binaire), certains sont au format Unix, d'autres sont DOS.
- Une fois le contenu récupéré, nous déterminons quel terminateur est utilisé.
- Personne n'est concerné une fois qu'il est chargé le temps qu'il faut pour le rendu dans la richtextbox. C'est juste la charge initiale du texte.
Maintenant pour les questions:
- Puis-je simplement utiliser StreamReader, puis vérifier la propriété Length (donc ProgressMax) et émettre une lecture pour une taille de tampon définie et parcourir dans une boucle while WHILST à l' intérieur d'un travailleur en arrière-plan, afin de ne pas bloquer le thread d'interface utilisateur principal? Puis renvoyez le générateur de chaînes au thread principal une fois qu'il est terminé.
- Le contenu ira à un StringBuilder. puis-je initialiser le StringBuilder avec la taille du flux si la longueur est disponible?
Est-ce que ce sont (selon vos opinions professionnelles) de bonnes idées? J'ai eu quelques problèmes dans le passé avec la lecture du contenu de Streams, car il manquera toujours les derniers octets ou quelque chose du genre, mais je poserai une autre question si tel est le cas.