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.

View in manual

Probably introduced at or before Emacs version 29.1.

Shortdoc

;; file
(file-has-changed-p "/tmp/foo")
    e.g. => t

Aliases

org-file-has-changed-p

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))))