Originally Posted by
MrDeath
that was what i thought. Did it worked? i am on linux so cant test it.
Actually, I didn't try it yet.
Originally Posted by
MrDeath
this website is blocked at my office. can u please copy and paste the solution. thx..
This is the actual piece of code performing the trick under Windows:
bool QxtFileLock::lock()
{
if (file() && file()->isOpen() && !isActive())
{
HANDLE w32FileHandle;
OVERLAPPED ov1;
DWORD dwflags;
w32FileHandle = (HANDLE)_get_osfhandle(file()->handle());
if (w32FileHandle == INVALID_HANDLE_VALUE)
return false;
switch (qxt_d().mode)
{
case ReadLock:
dwflags = LOCKFILE_FAIL_IMMEDIATELY;
break;
case ReadLockWait:
dwflags = 0;
break;
case WriteLock:
dwflags = LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY;
break;
case WriteLockWait:
dwflags = LOCKFILE_EXCLUSIVE_LOCK;
break;
default:
return (false);
}
memset(&ov1, 0, sizeof(ov1));
ov1.Offset = qxt_d().offset;
if (LockFileEx(w32FileHandle, dwflags, 0, qxt_d().length, 0, &ov1))
{
qxt_d().isLocked = true;
return true;
}
}
return false;
}
bool QxtFileLock::lock()
{
if (file() && file()->isOpen() && !isActive())
{
HANDLE w32FileHandle;
OVERLAPPED ov1;
DWORD dwflags;
w32FileHandle = (HANDLE)_get_osfhandle(file()->handle());
if (w32FileHandle == INVALID_HANDLE_VALUE)
return false;
switch (qxt_d().mode)
{
case ReadLock:
dwflags = LOCKFILE_FAIL_IMMEDIATELY;
break;
case ReadLockWait:
dwflags = 0;
break;
case WriteLock:
dwflags = LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY;
break;
case WriteLockWait:
dwflags = LOCKFILE_EXCLUSIVE_LOCK;
break;
default:
return (false);
}
memset(&ov1, 0, sizeof(ov1));
ov1.Offset = qxt_d().offset;
if (LockFileEx(w32FileHandle, dwflags, 0, qxt_d().length, 0, &ov1))
{
qxt_d().isLocked = true;
return true;
}
}
return false;
}
To copy to clipboard, switch view to plain text mode
If you ignore the inner class stuff, you see it's just a call to LockFileEx. The HANDLE is get by w32FileHandle = (HANDLE)_get_osfhandle(file()->handle());
Nice, but still I'm not satisfied. I cannot understand why this lock allows other programs to TRUNCATE the file!!! They cannot change the bytes, but they can still truncate it.
Is there any effective solution to lock a file in Windows outside CreateFile call?
It's incredible how Qt programmers has been "lazy" not implementing in QFile some damn decent way to lock the files without performing those hacks. Is a QFile :: open(QString path, OpenMode mode, LockingMode lmode) so impossible?
Bookmarks