InputB vs. Get; pages de codes; lecture lente sur un serveur unix

Nous avons utilisé le code habituel pour lire un fichier complet dans une chaîne de caractères pour ensuite parsingr VB6. Les fichiers sont du texte ANSI mais encodés en utilisant la page de code utilisée par l’utilisateur à l’époque (nous avons des utilisateurs chinois et anglais par exemple). C’est le code

Open FileName For Binary As nFileUnit sContents = StrConv(InputB(LOF(nFileUnit), nFileUnit), vbUnicode) 

Cependant, nous avons découvert que la lecture d’un fichier est TRÈS lente à partir d’un serveur exécutant Unix / Linux, en particulier lorsque la propriété du fichier n’est pas la même que celle du processus de lecture.

J’ai réécrit ce qui précède à l’aide de Get et découvert qu’il est beaucoup plus rapide et qu’il ne présente aucun problème de propriété de fichier. J’apprécie le fait que cela puisse être résolu en reconfigurant le serveur d’une manière ou d’une autre, mais je pense que depuis la découverte même sans ce problème, la méthode Get est encore plus rapide que InputB Je voudrais remplacer mon code existant par Get.

Je me demande si quelqu’un pourrait me dire si cela va vraiment faire la même chose. En particulier, fait-il correctement la conversion ANSI en Unicode et cela sera-t-il toujours vrai? Mes tests suggèrent que le code de remplacement suivant fait la même chose, mais plus rapidement:

  Open FileName For Binary As nFileUnit sContents = Ssortingng(LOF(nFileUnit), " ") Get #nFileUnit, , sContents 

Je réalise également que je pourrais utiliser un tableau d’octets, mais encore une fois mes tests suggèrent que ce qui précède est plus simple et fonctionne. Alors, comment le tampon fonctionne-t-il correctement (si vous pensez que l’aide en ligne de Get it Talk des caractères est renvoyée, cela entraînerait des problèmes lors de la lecture d’un fichier ANSI écrit en chinois sur la page de code chinoise).

Les points suivants pourraient être intéressants car l’approche InputB est généralement utilisée comme méthode pour lire un fichier complet, mais elle est beaucoup plus lente, par exemple.

Lecture d’un fichier 380Kb sur le réseau à partir du serveur unix

InputB (fichier appartenant) = 0.875 sec

InputB (non possédé) = 72.8 sec

Obtenir (non plus) = 0.0156 sec

Lecture d’un fichier de 9 Mo sur le réseau à partir du serveur unix

InputB (fichier possédé) = 19.65 sec

Obtenir (non plus) = 0.42 sec

Merci Jonathan

InputB () est CVar (InputB $ ()) et est connu pour être terriblement lent. Mon soupçon est que InputB $ () lit les octets et les convertit en Unicode en utilisant la page de codes actuelle via une logique de stock pour lire le texte du disque, puis effectue une autre conversion en ANSI en utilisant la page de codes actuelle.

Vous pourriez être bien en avance pour utiliser ADODB.Stream.LoadFromFile () pour charger des fichiers texte ANSI complets. Vous pouvez définir le .Type = adTypeText et le .Charset = le codage ANSI approprié pour lire Unicode via .ReadText (x) où x peut être un nombre d’octets, ou adReadAll ou adReadLine. Pour la lecture de ligne, vous pouvez définir .LineSeparator sur adCR, adCRLF ou adLF si nécessaire.

De nombreuses valeurs Charset sont supscopes: KOI8 pour le cyrillique, Big5 pour le chinois, etc.