If you want to get size of all marked files you an simple call an external process of du:
(defun dired-get-size ()
(interactive)
(let ((files (dired-get-marked-files)))
(with-temp-buffer
(apply 'call-process "/usr/bin/du" nil t nil "-sch" files)
(message "Size of all marked files: %s"
(progn
(re-search-backward "\\(^[0-9.,]+[A-Za-z]+\\).*total$")
(match-string 1))))))
(define-key dired-mode-map (kbd "?") 'dired-get-size)That was the easy way … more fun would it be if you can get the file size just using elisp. I haven’t found a real convincing way to do that, but that piece of code works:
(defun cdrw-get-size ()
(interactive)
(let ((sum 0)
(files (dired-get-marked-files)))
(dolist (file files (format "%.1fM" sum))
(incf sum (/ (nth 8 (car
(directory-files-and-attributes (file-name-directory file) nil
(regexp-quote (file-name-nondirectory file))))) 1048576.0)))))But as you can see, it only display MB and that even not accurate, but if i just sum up the bytes, emacs return false numbers after 130MB because it can’t work with such big numbers. If you want other formats look at ls-lisp-human-size in ls-lisp.el.
The code is ugly and depressing slow, i would be happy if someone find a better solution