How to check whether file is open or not
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Wed Mar 7 04:40:28 EST 2007
En Wed, 07 Mar 2007 02:28:33 -0300, Ros <pyalbert at gmail.com> escribió:
> 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/library/aa273350(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:
py> from ctypes import *
py> crt = 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>
py> h = _sopen("C:\\1.txt", 0, _SH_DENYRW, 0)
py> h
3
py> h2 = _sopen("C:\\1.txt", 0, _SH_DENYRW, 0)
py> h2
-1
py> _close = crt._close
py> _close(h)
0
py> h2 = _sopen("C:\\1.txt", 0, _SH_DENYRW, 0)
py> h2
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
More information about the Python-list
mailing list