Tamanho do arquivo de imagem multiplataforma, o mesmo?

Tamanho do arquivo de imagem multiplataforma, o mesmo?

Meu aplicativo precisa saber o tamanho exato do arquivo (bytes) dos arquivos de imagem *.png. Isso funciona exatamente como esperado no 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}

Ele informa o tamanho do arquivo 1247, o que está correto. Infelizmente, não tenho acesso a outros sistemas operacionais (Windows, Mac). Isso também funcionaria lá? O valor relatado seria o mesmo, em sistemas diferentes?

EDIT: O que quero dizer é: entre aqueles que veem esta pergunta e usam Windows (MiKtex), o código acima informa o mesmo número que recebo no Linux? Está impresso em PDF. Deve ser o mesmo, mas quero ter certeza.

Por que faço isso: O uso de imagens é limitado. Para garantir que uma imagem seja “igual à aprovada anteriormente” em vez de “editada por alguém ao longo do caminho”, existem várias verificações, como o tamanho do arquivo.

Responder1

O lfs.attributes()usa stat()chamada de sistema de acordo comseu documentoque deve produzir resultados idênticos para arquivos em Linux, macOS, Windows epelo padrão POSIXo tamanho é o tamanho real do arquivo (após a resolução do link simbólico). Portanto, é seguro usar esse método para obter o tamanho do arquivo. Se você não acha que é seguro o suficiente, uma prática comum usada em lua para obter o tamanho do arquivo usando search pode ser usada, veja a outra resposta que postei.

Responder2

Em situações gerais, lfs.attributes()pode-se confiar no trabalho em várias plataformas. Uma alternativa mais lenta, mas com funcionamento garantido:

\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}

Modificado de: https://www.lua.org/pil/21.3.html

informação relacionada