Regarding Locking The File
-
bq. What's the help?
The idea is to share a file somewhere. Two applications are acessing the file, but since the applications are not hosted on the same machine, they do not share memory. [/quote]Sorry, I did not see: "2 Apps running on 2 different machines"
In first post @Indrajeet not mention this situation. -
What about "setPermissions":http://doc.qt.nokia.com/latest/qfile.html#setPermissions ? You can set QFile::ReadOwner | QFile::WriteOwner permission when you have access and QFile::ReadOther | QFile::WriteOther when you finish to read / write.
-
Hi All
I have created a DLL in QT which contains two functions.
1.)Read File
2.)Write FileThis DLL is used by more than 1 application on same PC.Read & Write will be performed on same file kept at some shared location.
So the problem Iam facing is all applications are trying to write file at same time.
So is there any way by which we can give access to only one at a time to write to the file.
so once he complete writing the other can writeGive Sample Code.
-
The fact that the function is in a dll is irrelevant. Are the applications that are in contention running on the same machine or separate machines? You hav said both so far.
If they are ont he same machine you can use QSystemSemaphore or a lock file type mechanism.
If they are on separate machines and the shared file is on some kidn of network drive then you will most likely be best using a lock file.
-
You are changing stories.
Yesterday you wrote (emphasis by me):
[quote author="Indrajeet" date="1308819271"]Hi
I dont want to exchange the data between 2 processes.
2 Apps running on 2 different machines access same file located at some location.
[/quote]Some 20 hours later it is (emphasis by me):
[quote author="Indrajeet" date="1308898293"]
This DLL is used by more than 1 application on same PC. Read & Write will be performed on same file kept at some shared location.
[/quote]Which one is the right one?
-
A QSystemSemaphore can protect a resource. A resource can almost anything: a block of memory, access to a piece of hardware, or access to a file. In your case, you allow only one access to your file at the same time. So, you create a semaphore with an appropriate key (perhaps "com.your.domain.your.app/yourFile" or something unique like that), and use an initial value of 1. Then, when you want to start accessing your file, you call the acquire() method on the semaphore, and check the return value. If the return value is true, then you have successfully acquired the resource (access to the file), and can proceed to modify the file. If you get a false, then something else is already accessing the file and you can not modify it.
-
I had a similar problem. My application is watching a directory using QFileSystemWatcher. If a new file is stored in the directory i want to read that file. The file is written to the directory by another application which is in no way connected to my app. The problem I encountered was that sometimes the FileSystemWatcher notices a new file and I start reading it with QFile.readAll() before it is acctually completely written, thus getting an empty or incomplete String. My dirty solution was checking if the file was modified within the last 2 seconds and if not start reading. This works in my case since the file is only once written and afterwards will only be accessed or modified by my application. But in the case mentioned by the OP this wont work.
@Andre: Will QSystemSemaphore be an adequate solution for my problem as well ?
-
[quote author="KA51O" date="1309335683"]@Andre: Will QSystemSemaphore be an adequate solution for my problem as well ?[/quote]
No, it will not.
The use of QSystemSemaphore assumes that the process all use that same semaphore to get access to the resource. If they don't (and your case, you can be sure of that), then the semaphore is useless. -
No you cannot read while someone else has aquired the semaphore and is writing.
How about using "QReadWriteLock":http://developer.qt.nokia.com/doc/qt-4.7/qreadwritelock.html ?
I think its more intuitive to use.