|
This looked easy but it wasn't
I want to
1/ Test if I have rights to delete a file
2/ lock it
3/ read it
4/ delete it
This is all in one process
Gave up on 1/ but tried to use CreateFile to lock it and found xerces-c was not able to access the file for reading in the same process.
Any pointers (no pun intended). Not .net just C++/Win32
Thanks
Iain
|
|
|
|
|
Iain Wiseman wrote: and found xerces-c was not able to access the file for reading in the same process. You really need to explain that in technical terms, i.e. what code you used and what errors you received. I'm not sure about item 1, but 2,3 and 4 are quite straightforward in Windows.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
I want to disable other processing from locking the file.
When I use CreateFile, this works except it also prevents Xerces from reading the file so the code looks a little like this
m_Handle = CreateFile(
TEXT(inFullyQualifiedPath.c_str()),
GENERIC_ALL,
0,
NULL,
OPEN_EXISTING,
NULL,
NULL);
m_ConfigFileParser = new xercesc::XercesDOMParser;
m_ConfigFileParser->parse(m_Filename.c_str());
The reading of the file fails because Xerces cannot open the file.
|
|
|
|
|
Solved by using
GENERIC_READ and FILE_SHARE_READ | FILE_SHARE_WRITE
|
|
|
|
|
Iain Wiseman wrote: FILE_SHARE_READ | FILE_SHARE_WRITE You do understand that those options allow other processes to read and write the file at the same time.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
If this isn't correct then is there something that is?
It seemed to work when I ran a separate process with the same code and put a pause in it.
I totally sure you are right. If you do know the right combination I would be grateful. It seemed such a simple thing to want to do.
Iain
|
|
|
|
|
Sorry, I'm not sure exactly what your problem is. You said it works now, I was just pointing out that those options mean you do not have exclusive access to the file.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
I am simply after in one process being able to prevent someone else opening a file whilst I am reading it. I do not have control over the opening of the file as this is done within the Xerces library. The file is an xml file hence the use of xerces. Once I have completed the read I want to sometimes delete the file.
Ideally I would have like to in my process
Check I have exclusive rights to the file
Read it using xerces
Delete it
|
|
|
|
|
A Simple work around to your problem would be use your original code to get the exclusive access to file,
Read the file and create a temporary file which you can pass it to Xerces.. later delete the temp file.. and if you want delete even the source/original file.
Other alternatives could be to check if xerces takes text(some temp buffer) as input instead of file name.. so you can read the file in buffer and pass it to xerces.
|
|
|
|
|
Iain Wiseman wrote: I do not have control over the opening of the file as this is done within the Xerces library. In that case there is nothing you can do to gain exclusive access to it. I have no experience of the Xerces library, but are you sure there is no option to pass the handle of a previously opened file into it?
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
I did in the end copy the file to a temporary file which gets destroyed on destruction.
Thanks all for your help.
|
|
|
|
|
I don't think this should be addressed to me.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
Don't you read the file if the access is denied to delete it?
Otherwise, simply try to delete the file using DeleteFile. It will give you ERROR_ACCESSDENIED return code if it fails.
Alternatively you can check the File Security information Check Here[^]
-Sarath.
Rate the answers and close your posts if it's answered
|
|
|
|