http://www.perlmonks.org?node_id=784527


in reply to Using Win32::OLE and Excel - Tips and Tricks

Hi, at first I just want to thank you for the great tutorial, but I still have a problem.
I am working with a file which is accessible by many users via network. When I open the excel-file I want to check, whether the file is opened by an other user or not. I just want to work with it if it is not opened.
A simple die() if it is in use would be enough for me.
So, is it possible to check whether an other user has opened the file?

Great Regards,
- fish
  • Comment on Check whether the file is in use by an other user

Replies are listed 'Best First'.
Re: Check whether the file is in use by an other user
by wazoox (Prior) on Jul 30, 2009 at 11:03 UTC
    IIRC Windows locks the file when opened. You may be able to check the file lock state, maybe something like this (I have no windows box to test):
    open my $fh, "/some/file" or die "can't open!"; # try/catch file locking eval { flock $fh, 'LOCK_EX' or die "can't lock!" }; if ( $@) { warn "open file!" && exit; }
      Thanks for your response. I tried your code and it's not bad but not exactly what I expected. Instead of showing an error-message if the file is opened the program waits until the file is getting closed. That is not bad, but kind of useless for my problem.

      I am sure we are pretty near to a solution, so can somebody tell me how it works - please ;)

      Best regards,
      - fish
        See the flock documentation to check the various (and numerous) available flags, there is probably one of them that'll do what you want :) BTW you really should have posted this in its own thread, because it's a problem completely unrelated to the scope of this tutorial.
        For those of you who are interessted in the topic. I solved the problem by myself.

        sysopen(FH, $file, O_WRONLY|O_EXCL) or die $!; works fine for me and it even works if the file is opened via a shared folder.

        Finally I want to apologize for my offtopic-postings. I thougt the "fileInUse"-check would be possible with a Win32::OLE-function and because of that I posted here and did not create a new thread. I hope I will do better in future.

        Best regards from sunny Germany.