Ist die Bilddateigröße plattformübergreifend gleich?

Ist die Bilddateigröße plattformübergreifend gleich?

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

verwandte Informationen