Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Determining if a file is locked in Windows (http://www.velocityreviews.com/forums/t395389-determining-if-a-file-is-locked-in-windows.html)

elake 10-18-2006 07:39 PM

Determining if a file is locked in Windows
 
I found this thread about a pst file in Windows being locked and I am
having the same issue.

http://groups.google.com/group/comp....iles%27&rnum=1

The problem is that I have a script that can find the pst files on
every machine in my network and back them up to a server for safe
keeping. The problem is that when Outlook is running it locks the file
and will not allow me to copy it to the destination. I am using the
shutil module for the copy.

Is there a way to first determine if the file is locked and then do the
copy if it isn't? I thought about looking to see if Outlook.exe is
running but the machines are shared and the process could be running
but with a different pst file in use.

Thanks in advance


Larry Bates 10-18-2006 09:49 PM

Re: Determining if a file is locked in Windows
 
elake wrote:
> I found this thread about a pst file in Windows being locked and I am
> having the same issue.
>
> http://groups.google.com/group/comp....iles%27&rnum=1
>
> The problem is that I have a script that can find the pst files on
> every machine in my network and back them up to a server for safe
> keeping. The problem is that when Outlook is running it locks the file
> and will not allow me to copy it to the destination. I am using the
> shutil module for the copy.
>
> Is there a way to first determine if the file is locked and then do the
> copy if it isn't? I thought about looking to see if Outlook.exe is
> running but the machines are shared and the process could be running
> but with a different pst file in use.
>
> Thanks in advance
>

Try the copy and catch the exception instead.

-Larry Bates

elake 10-19-2006 02:44 PM

Re: Determining if a file is locked in Windows
 
Larry Bates wrote:
> elake wrote:
> > I found this thread about a pst file in Windows being locked and I am
> > having the same issue.
> >


> > http://groups.google.com/group/comp....iles%27&rnum=1
> >
> > The problem is that I have a script that can find the pst files on
> > every machine in my network and back them up to a server for safe
> > keeping. The problem is that when Outlook is running it locks the file
> > and will not allow me to copy it to the destination. I am using the
> > shutil module for the copy.
> >
> > Is there a way to first determine if the file is locked and then do the
> > copy if it isn't? I thought about looking to see if Outlook.exe is
> > running but the machines are shared and the process could be running
> > but with a different pst file in use.
> >
> > Thanks in advance
> >

> Try the copy and catch the exception instead.
>
> -Larry Bates


Larry thanks for your suggestion. this is what I tried:

#!/usr/bin/env python

import os, shutil

path = 'c:\documents and settings\username\Local Settings\Application
Data\Microsoft\Outlook'

src = 'Outlook.pst'
dst = 'test.pst'

os.chdir(path)

try:
shutil.copy2(src, dst)
except IOError:
print 'Must be locked by Outlook'

print 'Finished'

The problem is that even though I catch the IOError it overwrites the
dst file and makes it 0kb. This is going to be for backing these files
up and it wont be good to overwrite the backup with a bad copy.

Is there another way to do this that I am missing. I am still kind of
new to Python. If i could tell that outlook had the file locked before
I tried the copy then I think that it would be prevented.


MatthewWarren 10-19-2006 03:11 PM

Re: Determining if a file is locked in Windows
 
elake wrote:
> Larry Bates wrote:
> > elake wrote:
> > > I found this thread about a pst file in Windows being locked and I am
> > > having the same issue.
> > >

>
> > > http://groups.google.com/group/comp....iles%27&rnum=1
> > >
> > > The problem is that I have a script that can find the pst files on
> > > every machine in my network and back them up to a server for safe
> > > keeping. The problem is that when Outlook is running it locks the file
> > > and will not allow me to copy it to the destination. I am using the
> > > shutil module for the copy.
> > >
> > > Is there a way to first determine if the file is locked and then do the
> > > copy if it isn't? I thought about looking to see if Outlook.exe is
> > > running but the machines are shared and the process could be running
> > > but with a different pst file in use.
> > >
> > > Thanks in advance
> > >

> > Try the copy and catch the exception instead.
> >
> > -Larry Bates

>
> Larry thanks for your suggestion. this is what I tried:
>
> #!/usr/bin/env python
>
> import os, shutil
>
> path = 'c:\documents and settings\username\Local Settings\Application
> Data\Microsoft\Outlook'
>
> src = 'Outlook.pst'
> dst = 'test.pst'
>
> os.chdir(path)
>
> try:
> shutil.copy2(src, dst)
> except IOError:
> print 'Must be locked by Outlook'
>
> print 'Finished'
>
> The problem is that even though I catch the IOError it overwrites the
> dst file and makes it 0kb. This is going to be for backing these files
> up and it wont be good to overwrite the backup with a bad copy.
>
> Is there another way to do this that I am missing. I am still kind of
> new to Python. If i could tell that outlook had the file locked before
> I tried the copy then I think that it would be prevented.


maybe try and open the file for reading first, then if it opens ok,
just close it and do the copy?


elake 10-19-2006 04:39 PM

Re: Determining if a file is locked in Windows
 

MatthewWarren wrote:
> elake wrote:
> > Larry Bates wrote:
> > > elake wrote:
> > > > I found this thread about a pst file in Windows being locked and I am
> > > > having the same issue.
> > > >

> >
> > > > http://groups.google.com/group/comp....iles%27&rnum=1
> > > >
> > > > The problem is that I have a script that can find the pst files on
> > > > every machine in my network and back them up to a server for safe
> > > > keeping. The problem is that when Outlook is running it locks the file
> > > > and will not allow me to copy it to the destination. I am using the
> > > > shutil module for the copy.
> > > >
> > > > Is there a way to first determine if the file is locked and then do the
> > > > copy if it isn't? I thought about looking to see if Outlook.exe is
> > > > running but the machines are shared and the process could be running
> > > > but with a different pst file in use.
> > > >
> > > > Thanks in advance
> > > >
> > > Try the copy and catch the exception instead.
> > >
> > > -Larry Bates

> >
> > Larry thanks for your suggestion. this is what I tried:
> >
> > #!/usr/bin/env python
> >
> > import os, shutil
> >
> > path = 'c:\documents and settings\username\Local Settings\Application
> > Data\Microsoft\Outlook'
> >
> > src = 'Outlook.pst'
> > dst = 'test.pst'
> >
> > os.chdir(path)
> >
> > try:
> > shutil.copy2(src, dst)
> > except IOError:
> > print 'Must be locked by Outlook'
> >
> > print 'Finished'
> >
> > The problem is that even though I catch the IOError it overwrites the
> > dst file and makes it 0kb. This is going to be for backing these files
> > up and it wont be good to overwrite the backup with a bad copy.
> >
> > Is there another way to do this that I am missing. I am still kind of
> > new to Python. If i could tell that outlook had the file locked before
> > I tried the copy then I think that it would be prevented.

>
> maybe try and open the file for reading first, then if it opens ok,
> just close it and do the copy?


I tried to do that and it did let me open it without an error. Here is
what I have done now and it seems work.

def copyFile(src, dst):
if os.path.isfile(dst):
shutil.copy2(dst, dst_bak)
try:
shutil.copy2(src, dst)
except IOError:
if os.path.isfile(dst_bak):
shutil.copy2(dst_bak, dst)
os.remove(dst_bak)
else:
try:
shutil.copy2(src, dst)
except IOError:
if os.path.isfile(dst_bak):
shutil.copy2(dst_bak, dst)

It check to see if the dst file is there first and them makes a backup
of it first. That way if the copy goes bad then there is still a backup
of it. Do you see anywhere that I could have done this
better/differently?


Ricardo Reyes 10-20-2006 04:08 PM

Re: Determining if a file is locked in Windows
 
elake wrote:
> Larry Bates wrote:
> > elake wrote:
> > > I found this thread about a pst file in Windows being locked and I am
> > > having the same issue.
> > >

>


>
> The problem is that even though I catch the IOError it overwrites the
> dst file and makes it 0kb. This is going to be for backing these files
> up and it wont be good to overwrite the backup with a bad copy.
>


You can try to copy to a dst file that is not the backup file, but
instead it's in a temp location or with a temp name.

If the copy fails with IOError, just delete the new 0 bytes temp file.
If the copy doesn't fail, delete the old backup, rename the new temp
file to the destination name, and you are done. The rename part
shouldn't fail since you are operating in a new file that's not locked.
And for extra safety, don't erase the old backup before renaming the
new one, but rename to .bak.old or something like that.

Good luck.

Ricardo


Ricardo Reyes 10-20-2006 04:08 PM

Re: Determining if a file is locked in Windows
 
elake wrote:
> Larry Bates wrote:
> > elake wrote:
> > > I found this thread about a pst file in Windows being locked and I am
> > > having the same issue.
> > >

>


>
> The problem is that even though I catch the IOError it overwrites the
> dst file and makes it 0kb. This is going to be for backing these files
> up and it wont be good to overwrite the backup with a bad copy.
>


You can try to copy to a dst file that is not the backup file, but
instead it's in a temp location or with a temp name.

If the copy fails with IOError, just delete the new 0 bytes temp file.
If the copy doesn't fail, delete the old backup, rename the new temp
file to the destination name, and you are done. The rename part
shouldn't fail since you are operating in a new file that's not locked.
And for extra safety, don't erase the old backup before renaming the
new one, but rename to .bak.old or something like that.

Good luck.

Ricardo



All times are GMT. The time now is 04:42 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.