Discussion:
Problem with os.listdir and delay with unreachable network drives on Windows
Read Roberts
2004-12-22 23:02:38 UTC
Permalink
I wrote my own directory browser in order to get around a bug where
tkFileDialog.askdirectory() can't handle non-ascii paths. However, I
have a problem where I call os.listdir() on a mapped network drive,
e.g. os.listdir("Z:\\"), and if the network drive is unavailable, the
UI hangs until the OS returns with an exception because the network
shared drive is unavailable.

I would like to work around this by simply not looking into mapped
drives that are not currently mounted. Is there some way to check
the status of mapped drive to see if it is currently mounted, or a
better solution? ( I use the call win32api.GetLogicalDriveStrings()
to get the list of available drives).

Also, is there any way to enumerate remote volumes that are mounted
by not mapped? I can't easily find this in the win32 stuff or via
googling. The win32net calls to enumerate servers and shares sound
likely, but don't show such volumes on my system, although I may not
be using the right arguments.

I have the current Windows binary install of Python 2.3.4 on my
Windows XP system.
Read Roberts
2004-12-27 19:07:44 UTC
Permalink
Thank you for your response - this was very helpful.

I find that 'win32net.NetGetUseInfo()' does not
deal with UNC names - it seems to require a drive
specification in the form of a single letter.
The following sequence worked well for me,
resulting in a much shorter 'hang time' for
unreachable network mapped drives than simply
calling gos.listdir()


# get list of logical drive strginsdrive strings
volumeList = win32api.GetLogicalDriveStrings().split("\000")[:-1]


# some time later...
# vol is an entry in the volumeList.

driveLetter= vol[0]
dirList = []
if win32file.DRIVE_REMOTE = win32file.GetDriveType(driveLetter):
try:
driveStatus = win32net.NetUseGetInfo(None, driveLetter, 3)
if driveStatus['status'] == 0:
dirList = os.listdir(vol)
else:
# tell user the selected drive is not available.
except pywinypes.error(e)
# tell user the selected drive is not available
# happens when drive letter is not one
# of the current logical drives
From: Andrey Ivanov <ai2... at yandex.ru> - Find messages by this author
Date: Thu, 23 Dec 2004 11:44:17 +0300
Local:? Thurs, Dec 23 2004 12:44?am
Subject: Re: Problem with os.listdir and delay
with unreachable network drives on Windows
Reply | Reply to Author | Forward | Print |
Individual Message | Show original | Report Abuse
[Read Roberts]
- Show quoted text -
Maybe a win32net.WNetGetUniversalName() [expands drive to UNC name]
and win32net.NetGetUseInfo() ?[returns ?various ?info ?on ?UNC ?name
including status] will help you. I don't have a time to setup shares,
so I can't guarantee that this approach will work as you expect. First
function might raise an exception on disconnected devices, which you
will need to handle. You might also need win32file.GetDriveType() to
distinguish between remote and local drives.
--
Andrey
Andrey Ivanov
2004-12-23 08:44:17 UTC
Permalink
[Read Roberts]
Post by Read Roberts
I wrote my own directory browser in order to get around a bug where
tkFileDialog.askdirectory() can't handle non-ascii paths. However, I
have a problem where I call os.listdir() on a mapped network drive,
e.g. os.listdir("Z:\\"), and if the network drive is unavailable, the
UI hangs until the OS returns with an exception because the network
shared drive is unavailable.
I would like to work around this by simply not looking into mapped
drives that are not currently mounted. Is there some way to check
the status of mapped drive to see if it is currently mounted, or a
better solution? ( I use the call win32api.GetLogicalDriveStrings()
to get the list of available drives).
Also, is there any way to enumerate remote volumes that are mounted
by not mapped? I can't easily find this in the win32 stuff or via
googling. The win32net calls to enumerate servers and shares sound
likely, but don't show such volumes on my system, although I may not
be using the right arguments.
I have the current Windows binary install of Python 2.3.4 on my
Windows XP system.
Maybe a win32net.WNetGetUniversalName() [expands drive to UNC name]
and win32net.NetGetUseInfo() [returns various info on UNC name
including status] will help you. I don't have a time to setup shares,
so I can't guarantee that this approach will work as you expect. First
function might raise an exception on disconnected devices, which you
will need to handle. You might also need win32file.GetDriveType() to
distinguish between remote and local drives.
--
Andrey
Loading...