[dolphin] [Bug 508514] New: moving files to trash across filesystems is slow

"Milan Hauth" <[email protected]>
Newsgroups gmane.comp.kde.devel.kfm
Message-ID <[email protected]/>
https://bugs.kde.org/show_bug.cgi?id=508514

            Bug ID: 508514
           Summary: moving files to trash across filesystems is slow
    Classification: Applications
           Product: dolphin
      Version First 25.04.2
       Reported In:
          Platform: Other
                OS: Linux
            Status: REPORTED
          Severity: normal
          Priority: NOR
         Component: general
          Assignee: [email protected]
          Reporter: [email protected]
                CC: [email protected]
  Target Milestone: ---

SUMMARY
removing files from an external hard drive is slow
because the files are moved to the filesystem of ~/.local/share/Trash/files/

STEPS TO REPRODUCE
1. remove a large file on a filesystem different from
~/.local/share/Trash/files/

OBSERVED RESULT
files are moved across different filesystems, which is slow

EXPECTED RESULT
it should try to move files to /.local/share/Trash/files/ on the same filesytem
and only if that fails, it should move files to ~/.local/share/Trash/files/

python script:
https://github.com/milahu/random/blob/master/python/trash-on-same-filesystem.py

~~~
#!/usr/bin/env python3
# move files to trash, the "smart" way. "smart" as in:
# try to avoid moving files across different filesystems (which is slow)
# FIXME mp_trash_path is readable by other users
import os, sys
trash_subpath = ".local/share/Trash/files"
default_trash_path = os.path.realpath(os.path.join(os.environ["HOME"],
trash_subpath))
# default_trash_dev = os.stat(default_trash_path).st_dev;
print("default_trash_dev", default_trash_dev)
def find_mount_point(path): # https://stackoverflow.com/a/4453715/10440128
    path = os.path.realpath(path)
    while not os.path.ismount(path):
        path = os.path.dirname(path)
    return path
def get_path2(path, trash_dir):
    os.makedirs(trash_dir, exist_ok=True)
    path2 = os.path.join(trash_dir, os.path.basename(path))
    return path2
for path in sys.argv[1:]:
    print("trashing", repr(path))
    # path_dev = os.stat(path).st_dev; print("path_dev", path_dev)
    mp_path = find_mount_point(path)
    print("  mp_path", repr(mp_path))
    mp_trash_path = os.path.realpath(os.path.join(mp_path, trash_subpath))
    done_move = False
    for trash_path in set([default_trash_path, mp_trash_path]):
        path2 = get_path2(path, trash_path)
        try:
            os.rename(path, path2) # this only works on the same filesystem
            print(f"  fast path: moved file to the same-filesystem trash
{trash_path}")
            done_move = True
            break
        except OSError as exc: # [Errno 18] Invalid cross-device link
            pass # path and path2 are on different filesystems
    if done_move: continue
    trash_path = default_trash_path
    path2 = get_path2(path, trash_path)
    shutil.move(path, path2) # slow path: copy + unlink
    print(f"  slow path: moved file to the other-filesystem trash
{trash_path}")
~~~

SOFTWARE/OS VERSIONS
OS: NixOS Linux
KDE Plasma Version: 6.4.0
KDE Frameworks Version: 6.15.0
Qt Version: 6.9.0

ADDITIONAL INFORMATION
this may be a qt bug in QFile::moveToTrash
https://doc.qt.io/qt-6/qfile.html#moveToTrash

-- 
You are receiving this mail because:
You are on the CC list for the bug.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.