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