私のアプリケーションは、*.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標準によるサイズは、ファイルの実際のサイズです (シンボリック リンクが解決された後)。したがって、この方法を使用してファイル サイズを取得するのは安全です。この方法が十分に安全ではないと思われる場合は、seek を使用してファイル サイズを取得するために lua で使用される一般的な方法を使用できます。私が投稿した他の回答を参照してください。
答え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}