diff --git a/src/csync/vio/csync_vio_local_win.cpp b/src/csync/vio/csync_vio_local_win.cpp index cc31927d566d1..7aa07f4da4eac 100644 --- a/src/csync/vio/csync_vio_local_win.cpp +++ b/src/csync/vio/csync_vio_local_win.cpp @@ -163,7 +163,8 @@ std::unique_ptr csync_vio_local_readdir(csync_vio_handle_t *h } else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { file_stat->type = ItemTypeDirectory; } else { - file_stat->type = ItemTypeFile; + // exclude ".lnk" files as they are not essential, but, causing troubles when enabling the VFS due to QFileInfo::isDir() and other methods are freezing, which causes the ".lnk" files to start hydrating and freezing the app eventually. + file_stat->type = !OCC::FileSystem::isLnkFile(path) ? ItemTypeFile : ItemTypeSoftLink; } /* Check for the hidden flag */ diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index edded199a7373..b83493c2ba539 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -13,6 +13,7 @@ */ #include "discovery.h" +#include "common/filesystembase.h" #include "common/syncjournaldb.h" #include "syncfileitem.h" #include @@ -177,9 +178,15 @@ void ProcessDirectoryJob::process() // local stat function. // Recall file shall not be ignored (#4420) bool isHidden = e.localEntry.isHidden || (f.first[0] == '.' && f.first != QLatin1String(".sys.admin#recall#")); +#ifdef Q_OS_WIN + // exclude ".lnk" files as they are not essential, but, causing troubles when enabling the VFS due to QFileInfo::isDir() and other methods are freezing, which causes the ".lnk" files to start hydrating and freezing the app eventually. + const bool isServerEntryWindowsShortcut = !e.localEntry.isValid() && e.serverEntry.isValid() && !e.serverEntry.isDirectory && FileSystem::isLnkFile(e.serverEntry.name); +#else + const bool isServerEntryWindowsShortcut = false; +#endif if (handleExcluded(path._target, e.localEntry.name, e.localEntry.isDirectory || e.serverEntry.isDirectory, isHidden, - e.localEntry.isSymLink)) + e.localEntry.isSymLink || isServerEntryWindowsShortcut)) continue; if (_queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original)) { diff --git a/src/libsync/vfs/cfapi/vfs_cfapi.cpp b/src/libsync/vfs/cfapi/vfs_cfapi.cpp index c9d05ce07e174..dcd75d46d0694 100644 --- a/src/libsync/vfs/cfapi/vfs_cfapi.cpp +++ b/src/libsync/vfs/cfapi/vfs_cfapi.cpp @@ -184,6 +184,8 @@ bool VfsCfApi::statTypeVirtualFile(csync_file_stat_t *stat, void *statData) const auto hasReparsePoint = (ffd->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; const auto hasCloudTag = (ffd->dwReserved0 & IO_REPARSE_TAG_CLOUD) != 0; + const auto isWindowsShortcut = !isDirectory && FileSystem::isLnkFile(stat->path); + // It's a dir with a reparse point due to the placeholder info (hence the cloud tag) // if we don't remove the reparse point flag the discovery will end up thinking // it is a file... let's prevent it @@ -195,7 +197,7 @@ bool VfsCfApi::statTypeVirtualFile(csync_file_stat_t *stat, void *statData) } else if (isSparseFile && isPinned) { stat->type = ItemTypeVirtualFileDownload; return true; - } else if (!isSparseFile && isUnpinned){ + } else if (!isSparseFile && isUnpinned && !isWindowsShortcut){ stat->type = ItemTypeVirtualFileDehydration; return true; } else if (isSparseFile) {