Meine Anwendung muss die genaue Dateigröße (Bytes) von *.png-Bilddateien kennen. Dies funktioniert unter Linux genau wie erwartet:
% !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}
Es wird eine Dateigröße von 1247 gemeldet, was korrekt ist. Leider habe ich keinen Zugriff auf andere Betriebssysteme (Windows, Mac). Würde dies dort auch funktionieren? Wäre der gemeldete Wert auf verschiedenen Systemen derselbe?
EDIT: Was ich meine ist: Gibt der obige Code bei denen, die diese Frage sehen und Windows (MiKtex) verwenden, die gleiche Zahl aus, die ich unter Linux bekomme? Sie ist im PDF abgedruckt. Sollte die gleiche sein, aber ich möchte sicher sein.
Warum ich das mache: Die Verwendung von Bildern ist begrenzt. Um sicherzustellen, dass ein Bild „dasselbe ist wie zuvor genehmigt“ und nicht „von jemandem zwischendurch bearbeitet wurde“, gibt es mehrere Kontrollen, wie z. B. die Dateigröße.
Antwort1
Der lfs.attributes()
verwendete stat()
Systemaufruf erfolgt gemäßsein DokumentDies sollte für Dateien unter Linux, macOS, Windows undnach POSIX-Standarddie Größe ist die tatsächliche Größe der Datei (nachdem der symbolische Link aufgelöst wurde). Es ist also sicher, diese Methode zu verwenden, um die Dateigröße zu ermitteln. Wenn Sie das nicht für sicher genug halten, können Sie eine in Lua gängige Methode verwenden, um die Dateigröße mit Seek zu ermitteln. Lesen Sie dazu die andere Antwort, die ich gepostet habe.
Antwort2
Im Allgemeinen lfs.attributes()
kann man davon ausgehen, dass es plattformübergreifend funktioniert. Eine langsamere, aber garantiert funktionierende Alternative:
\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}
Modifiziert von: https://www.lua.org/pil/21.3.html