我的应用程序需要知道 *.png 图像文件的确切文件大小(字节)。这在 Linux 上完全符合预期:
% !TeX TS-program = lualatex
% !TeX encoding = UTF-8
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
\usepackage{mwe}
\usepackage{graphics}
\gdef\getfilesize#1{%
\directlua{
local filename = ("\luaescapestring{#1}")
local foundfile = kpse.find_file(filename, "tex", true)
if foundfile then
local size = lfs.attributes(foundfile, "size")
if size then
tex.write(size)
end
end
}%
}
\begin{document}
\includegraphics{example-image-4x3.png}\par
Above file size: \getfilesize{example-image-4x3.png}\par
\end{document}
它报告文件大小为 1247,这是正确的。唉,我无法访问其他操作系统(Windows、Mac)。这在那里也能用吗?在不同的系统上,报告的值是否相同?
编辑:我的意思是:对于那些看到这个问题并使用 Windows(MiKtex)的人来说,上面的代码报告的数字是否与我在 Linux 上得到的数字相同?它打印在 PDF 中。应该是一样的,但我想确定一下。
我这样做的原因:图片的使用是有限的。为了确保图片“与之前批准的一样”而不是“在过程中被某人编辑过”,需要进行多项检查,例如文件大小。
答案1
使用lfs.attributes()
系统stat()
调用其文件对于 Linux、macOS、Windows 上的文件,它应该会产生相同的结果,按照 POSIX 标准大小是文件的实际大小(解析符号链接后)。因此,使用该方法获取文件大小是安全的。如果您认为这不够安全,可以使用 lua 中常用的通过 seek 获取文件大小的做法,请参阅我发布的另一个答案。
答案2
一般情况下lfs.attributes()
可以信任跨平台工作。速度较慢但保证有效的替代方案:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
%\usepackage{mwe}
\usepackage{graphics}
\gdef\getfilesize#1{%
\directlua{
function fsize (file)
local h = io.open(file)
local size = h:seek("end")
assert(h:close())
return size
end
local filename = ("\luaescapestring{#1}")
local foundfile = kpse.find_file(filename, "tex", true)
if foundfile then
local size = fsize(foundfile)
if size then
tex.write(size)
end
end
}%
}
\begin{document}
\includegraphics{example-image-4x3.png}\par
Above file size: \getfilesize{example-image-4x3.png}\par
\end{document}