views:

919

answers:

3

How do I check if a file is already used by another process from Powerscript ?

A: 

You could try to open it and if it errors then it is probably already locked.

Brody
+2  A: 

The best way that I found is to call the WinAPI CreateFile to open a given file in exclusive mode.

First, declare the following Local External Function (PB10)

FUNCTION Long CreateFile(ref string lpszName, long fdwAccess, long fdwShareMode, long lpsa, &
long fdwCreate, long fdwAttrsAndFlags, long hTemplateFile) LIBRARY "Kernel32.dll" &
ALIAS FOR "CreateFileA;Ansi"
FUNCTION boolean CloseHandle (long file_hand) LIBRARY "KERNEL32.DLL"

then from Powerscript :

CONSTANT ulong GENERIC_ACCESS = 268435456  //  &H10000000
CONSTANT ulong EXCLUSIVE_ACCESS = 0
CONSTANT ulong OPEN_EXISTING = 3

long ll_handle
String ls_file 

ls_file = "c:\temp\myfile.xls"

ll_handle = CreateFile ( ls_file, GENERIC_ACCESS, EXCLUSIVE_ACCESS,  0, OPEN_EXISTING, 0, 0) 
IF ll_handle < 1 THEN 
    MessageBox("", "Can't open, maybe missing or already opened ?!?")
ELSE
    MessageBox("","File can be opened")
END IF

CloseHandle(ll_handle)
RealHowTo
A: 

This is not PB specific, but you can use it from PB: In the Sysinternals collection there's a command line utility called Handle. You can use it to list all the processes that have a handle to a specified object (such as a file). The tool's output is a readable message to the standard output, but you can redirect it to a file and analyze it.

Most chances are you can make do with merely trying to open the file in exclusive mode, but if you'd also like to know who's holding that file you can use the utility I mentioned above.

eran