我正在构建一个通用函数来读取文本文件,可能是 Ascii、UTF-8 或 UTF-16。(调用函数时,编码是已知的)。文件名可能包含 UTF8 字符,因此标准的 lua io 函数不是解决方案。我无法控制 Lua 实现(5.3)或环境中可用的二进制模块。
我目前的代码是:
require "luacom"
local function readTextFile(sPath, bUnicode, iBits)
local fso = luacom.CreateObject("Scripting.FileSystemObject")
if not fso:FileExists(sPath) then return false, "" end --check the file exists
local so = luacom.CreateObject("ADODB.Stream")
--so.CharSet defaults to Unicode aka utf-16
--so.Type defaults to text
so.Mode = 1 --adModeRead
if not bUnicode then
so.CharSet = "ascii"
elseif iBits == 8 then
so.CharSet = "utf-8"
end
so:Open()
so:LoadFromFile(sPath)
local contents = so:ReadText()
so:Close()
return true, contents
end
--test Unicode(utf-16) files
local file = "D:\\OneDrive\\Desktop\\utf16.txt" --this exists
local booOK, factsetcontents = readTextFile(file, true, 16)
执行时出现错误: COM exception:(d:\my\lua\luacom-master\src\library\tluacom.cpp,382):Operation is not allowed in this context
在第 19 行 [local stream = so:LoadFromFile(sPath)]
我仔细阅读了 ADO 文档,显然遗漏了一些让我眼前一亮的东西!我想做的事是不可能的吗?
ETA:如果我注释掉 so.Mode = 1 行,这行得通。这很好,但我不明白为什么,这意味着我最终可能会在不知不觉中犯同样的错误,不管那个错误是什么!