Мы использовали обычный код для чтения полного файла в строку и последующего анализа в VB6. Файлы представляют собой текстовый формат ANSI, но кодируются с использованием любой кодовой страницы, на которой пользователь находился в то время (например, у нас есть пользователи на китайском и английском языках). Это код
Open FileName For Binary As nFileUnit
sContents = StrConv(InputB(LOF(nFileUnit), nFileUnit), vbUnicode)
Однако мы обнаружили, что это ОЧЕНЬ медленное чтение файла с сервера под управлением unix / linux, особенно когда владение файлом не совпадает с процессом, выполняющим чтение.
Я переписал вышеизложенное с помощью Get и обнаружил, что это намного быстрее и не страдает от каких-либо проблем с владением файлами. Я ценю, что это может быть решено путем перенастройки сервера каким-либо образом, но я думаю, что после обнаружения даже без этой проблемы метод Get все еще намного быстрее, чем InputB. Я бы хотел заменить свой существующий код с помощью Get.
Интересно, мог бы кто-нибудь сказать мне, действительно ли это сделает то же самое? В частности, правильно ли выполняется преобразование ANSI в Unicode и будет ли это всегда так. Мои тесты показывают, что следующий код замены делает то же самое, но быстрее:
Open FileName For Binary As nFileUnit
sContents = String(LOF(nFileUnit), " ")
Get #nFileUnit, , sContents
Я также понимаю, что могу использовать байтовый массив, но опять же мои тесты показывают, что вышеприведенное проще и работает Итак, как работает буфер правильно (если вы считаете, что онлайн-справка по Get it сообщает о возвращенных символах - очевидно, это вызовет проблемы при чтении файла ANSI, написанного на кодовой странице китайского языка с двухбайтовыми китайскими символами в нем).
Следующее может представлять интерес, поскольку подход InputB обычно задается как метод для чтения полного файла, но он намного медленнее, примеры
Чтение 380 Кб файла по сети с сервера Unix
Ввод B (файл принадлежит) = 0,875 с
Ввод B (не принадлежит) = 72,8 с
Получить (либо) = 0,0156 с
Чтение файла 9Mb по сети с сервера Unix
Ввод B (файл принадлежит) = 19,65 с
Получить (либо) = 0,42 с
Спасибо
Jonathan