一般的是说有三种情况,我的不能正常删除的则都是因为文件锁定转态突然传输失败,导致文件一直被锁定中所以无法删除。

首先我们应该查看 数据目录下的 nextcloud.log文件来判断不能删除的文件是什么问题。可能有三种情况:


第一种常出现的问题就是文件被异常锁定

nexcloud.log部分摘录:
"message":"Exception: {\"Message\":\"HTTP\\\/1.1 423 \\\"path\\\/file.extension\\\" is locked\",
\"Exception\":\"OCA\\\\DAV\\\\Connector\\\\Sabre\\\\Exception\\\\FileLocked\",
\"Code\":0,\"Trace\":\"#0


此时是因为文件或目录被锁,可按以下操作暂时解决问题:

1)进入维护模式

php /path/to/nextcloud/web/occ maintenance:mode --on  或 sudo -u www php occ maintenance:mode --on


2)使用mysql命令行工具,在owncloud/nextcloud所在数据库中执行

DELETE FROM oc_file_locks WHERE 1


3)退出维护模式

php /path/to/nextcloud/web/occ maintenance:mode --off 或 sudo -u www php occ maintenance:mode --off


4)确保cron正常运行。


另一种情况就是权限不足

"app":"PHP","method":"DELETE","url":"\/remote.php\/webdav\***","message":"unlink(\/mnt\/***): Permission denied at ***/lib\/private\/Files\/Storage\/Local.php#112"

此时待删除的①文件、②目录、③目录中有文件 对于php进程无写入权限。

登录服务器给足权限,使用chown -R修复数据目录的权限解决。

还有一种情况,就是如果我们的数据目录中的部分是挂载或软连接

"method":"DELETE","url":"\/remote.php\/webdav\***","message":"rename(): The first argument to copy() function cannot be a directory at ***/lib\/private\/Files\/Storage\/Local.php#270"

"app":"PHP","method":"DELETE","url":"\/remote.php\/webdav\***","message":"rename(***files_trashbin\/files\/***): Invalid cross-device link at \/***\/lib\/private\/Files\/Storage\/Local.php#270"

此时需检查文件目录是否通过mount -bind方式挂载。如是,将导致nextcloud/owncloud的回收站机制失效。此时网页端和客户端均有删除失败提示,但实际上目录已经删除。为恢复回收站机制,需要取消mount -bind方式挂载目录。


还要在服务器认真检查目录的挂载和软连接都是否有限并且权限是否足够。