跨平台镜像文件大小一样吗?

跨平台镜像文件大小一样吗?

我的应用程序需要知道 *.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}

修改自: https://www.lua.org/pil/21.3.html

相关内容