How to check whether file is open or not

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Wed Mar 7 10:40:28 CET 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