Win32 long filename format for Qt functions.

This commit is contained in:
Klaas Freitag 2015-06-19 13:00:19 +02:00
parent 2f0a404116
commit e74801fd3d
2 changed files with 44 additions and 7 deletions

View file

@ -32,6 +32,7 @@
#include <windef.h>
#include <winbase.h>
#include <fcntl.h>
#endif
// We use some internals of csync:
@ -45,6 +46,16 @@ extern "C" {
namespace OCC {
QString FileSystem::longWinPath( const QString& inpath )
{
QString path(inpath);
path.replace('/', '\\');
path.prepend(QLatin1String("\\\\?\\"));
return path;
}
bool FileSystem::fileEquals(const QString& fn1, const QString& fn2)
{
// compare two files with given filename and return true if they have the same content
@ -80,7 +91,20 @@ bool FileSystem::fileEquals(const QString& fn1, const QString& fn2)
void FileSystem::setFileHidden(const QString& filename, bool hidden)
{
return csync_win32_set_file_hidden(filename.toUtf8().constData(), hidden);
#ifdef _WIN32
QString fName = longWinPath(filename);
DWORD dwAttrs;
dwAttrs = GetFileAttributesW( (wchar_t*)fName.utf16() );
if (dwAttrs != INVALID_FILE_ATTRIBUTES) {
if (hidden && !(dwAttrs & FILE_ATTRIBUTE_HIDDEN)) {
SetFileAttributesW((wchar_t*)fName.utf16(), dwAttrs | FILE_ATTRIBUTE_HIDDEN );
} else if (!hidden && (dwAttrs & FILE_ATTRIBUTE_HIDDEN)) {
SetFileAttributesW((wchar_t*)fName.utf16(), dwAttrs & ~FILE_ATTRIBUTE_HIDDEN );
}
}
#endif
}
time_t FileSystem::getModTime(const QString &filename)
@ -127,9 +151,12 @@ bool FileSystem::rename(const QString &originFileName,
bool success = false;
QString error;
#ifdef Q_OS_WIN
QString orig = longWinPath(originFileName);
QString dest = longWinPath(destinationFileName);
if (isLnkFile(originFileName) || isLnkFile(destinationFileName)) {
success = MoveFileEx((wchar_t*)originFileName.utf16(),
(wchar_t*)destinationFileName.utf16(),
success = MoveFileEx((wchar_t*)orig.utf16(),
(wchar_t*)dest.utf16(),
MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH);
if (!success) {
wchar_t *string = 0;
@ -235,8 +262,12 @@ bool FileSystem::uncheckedRenameReplace(const QString& originFileName,
#else //Q_OS_WIN
BOOL ok;
ok = MoveFileEx((wchar_t*)originFileName.utf16(),
(wchar_t*)destinationFileName.utf16(),
QString orig = longWinPath(originFileName);
QString dest = longWinPath(destinationFileName);
qDebug() << "** MOVE: " << orig;
ok = MoveFileEx((wchar_t*)orig.utf16(),
(wchar_t*)dest.utf16(),
MOVEFILE_REPLACE_EXISTING+MOVEFILE_COPY_ALLOWED+MOVEFILE_WRITE_THROUGH);
if (!ok) {
wchar_t *string = 0;
@ -274,8 +305,10 @@ bool FileSystem::openAndSeekFileSharedRead(QFile* file, QString* errorOrNull, qi
// Create the file handle.
SECURITY_ATTRIBUTES securityAtts = { sizeof(SECURITY_ATTRIBUTES), NULL, FALSE };
QString fName = longWinPath(file->fileName());
HANDLE fileHandle = CreateFileW(
(const wchar_t*)file->fileName().utf16(),
(const wchar_t*)fName.utf16(),
accessRights,
shareMode,
&securityAtts,
@ -356,7 +389,9 @@ static bool fileExistsWin(const QString& filename)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFileW( (wchar_t*)filename.utf16(), &FindFileData);
QString fName = FileSystem::longWinPath(filename);
hFind = FindFirstFileW( (wchar_t*)fName.utf16(), &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) {
return false;
}

View file

@ -46,6 +46,8 @@ bool fileEquals(const QString &fn1, const QString &fn2);
*/
void OWNCLOUDSYNC_EXPORT setFileHidden(const QString& filename, bool hidden);
/** convert a "normal" windows path into a path that can be 32k chars long. */
QString longWinPath( const QString& inpath );
/**
* @brief Get the mtime for a filepath