En Wed, 07 Mar 2007 02:28:33 -0300, Ros <py******@gmail.comescribió:
There are 10 files in the folder. I wish to process all the files one
by one. But if the files are open or some processing is going on them
then I do not want to disturb that process. In that case I would
ignore processing that particular file and move to next file.
How can I check whether the file is open or not?
I tried os.stat and os.access but I am not getting the expected
results.
Also I checked in IO exceptions, IO error handler doesnt raise any
error if the file is open.
There are some options to check but they are platform dependent (works
only with unix)
This works only on Windows:
You can use the _sopen function (from the C runtime library), which takes
additional flags for specifying file sharing. See
http://msdn2.microsoft.com/en-us/lib...50(VS.60).aspx
_sopen with _SH_DENYRW will fail if the file is already open by the same
or another process. Try to open the file using this flag: if _sopen
succeeds (does not return -1) the file was not already open (remember to
close it as soon as possible!); if _sopen fails (returns -1) it was
already open.
Using the ctypes module (included with Python 2.5; you can download and
install it for previous versions) you can call that function easily:
pyfrom ctypes import *
pycrt = cdll.msvcrt
py_sopen = crt._sopen
py_sopen.argtypes = (c_char_p, c_int, c_int, c_int)
py_SH_DENYRW = 0x10 # from <share.h>
pyh = _sopen("C:\\1.txt", 0, _SH_DENYRW, 0)
pyh
3
pyh2 = _sopen("C:\\1.txt", 0, _SH_DENYRW, 0)
pyh2
-1
py_close = crt._close
py_close(h)
0
pyh2 = _sopen("C:\\1.txt", 0, _SH_DENYRW, 0)
pyh2
3
py_close(h2)
0
Note: You said "But if the files are open or some processing is going on
them then I do not want to disturb that process.". There exist a (small)
risk of disturbing the other process: if it tries to open the file just
after you opened it, but before you close it, the operation will fail. It
is a tiny window, but might happen...
Surely there are other ways - some programs can report all processes
having a certain file opened, by example, but I don't know how to do that.
--
Gabriel Genellina