Function: file-has-changed-p
file-has-changed-p is a byte-compiled function defined in files.el.gz.
Signature
(file-has-changed-p FILE &optional TAG)
Documentation
Return non-nil if FILE has changed.
The size and modification time of FILE are compared to the size
and modification time of the same FILE during a previous
invocation of file-has-changed-p. Thus, the first invocation
of file-has-changed-p always returns non-nil when FILE exists.
The optional argument TAG, which must be a symbol, can be used to
limit the comparison to invocations with identical tags; it can be
the symbol of the calling function, for example.
Other relevant functions are documented in the file group.
Probably introduced at or before Emacs version 29.1.
Shortdoc
;; file
(file-has-changed-p "/tmp/foo")
e.g. => t
Aliases
Source Code
;; Defined in /usr/src/emacs/lisp/files.el.gz
(defun file-has-changed-p (file &optional tag)
"Return non-nil if FILE has changed.
The size and modification time of FILE are compared to the size
and modification time of the same FILE during a previous
invocation of `file-has-changed-p'. Thus, the first invocation
of `file-has-changed-p' always returns non-nil when FILE exists.
The optional argument TAG, which must be a symbol, can be used to
limit the comparison to invocations with identical tags; it can be
the symbol of the calling function, for example."
(let* ((file (directory-file-name (expand-file-name file)))
(remote-file-name-inhibit-cache t)
(fileattr (file-attributes file 'integer))
(attr (and fileattr
(cons (file-attribute-size fileattr)
(file-attribute-modification-time fileattr))))
(sym (concat (symbol-name tag) "@" file))
(cachedattr (gethash sym file-has-changed-p--hash-table)))
(when (not (equal attr cachedattr))
(puthash sym attr file-has-changed-p--hash-table))))