In QFileDialog delete a symlink rather than actual target it points to

In QFileDialog, when a resolved symlink gets deleted, the actual target
it points to gets deleted instead of the symlink itself. The patch is to
delete the symlink rather than actual target by doing the following:

1. In QFileDialog, if a directory being deleted is a resolved symlink,
do not remove the directory. Instead, call QFileSystemModel to remove
the model index.

2. In QFileSystemModel::remove(), use the full file path instead of
the resolved file path for deletion. For a symlink, delete the symlink
itself.

The patch is for Windows and Linux.

Task-number: QTBUG-29770
Change-Id: I4db545f0b5963acde3f89a8ee858338c23104804
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
This commit is contained in:
Dongmei Wang 2017-07-22 10:57:59 -07:00
parent 23187ade60
commit 5157c3e8bd
2 changed files with 7 additions and 4 deletions

View File

@ -3427,7 +3427,6 @@ void QFileDialogPrivate::_q_deleteCurrent()
QString fileName = index.data(QFileSystemModel::FileNameRole).toString();
QString filePath = index.data(QFileSystemModel::FilePathRole).toString();
bool isDir = model->isDir(index);
QFile::Permissions p(index.parent().data(QFileSystemModel::FilePermissions).toInt());
#if QT_CONFIG(messagebox)
@ -3452,7 +3451,7 @@ void QFileDialogPrivate::_q_deleteCurrent()
return;
#endif // QT_CONFIG(messagebox)
if (isDir) {
if (model->isDir(index) && !model->fileInfo(index).isSymLink()) {
if (!removeDirectory(filePath)) {
#if QT_CONFIG(messagebox)
QMessageBox::warning(q, q->windowTitle(),

View File

@ -203,8 +203,12 @@ QFileInfo QFileSystemModel::fileInfo(const QModelIndex &index) const
bool QFileSystemModel::remove(const QModelIndex &aindex)
{
const QString path = filePath(aindex);
const bool success = QFileInfo(path).isFile() ? QFile::remove(path) : QDir(path).removeRecursively();
Q_D(QFileSystemModel);
const QString path = d->filePath(aindex);
const QFileInfo fileInfo(path);
const bool success = (fileInfo.isFile() || fileInfo.isSymLink())
? QFile::remove(path) : QDir(path).removeRecursively();
#ifndef QT_NO_FILESYSTEMWATCHER
if (success) {
QFileSystemModelPrivate * d = const_cast<QFileSystemModelPrivate*>(d_func());