Is there a better way of listing Windows shares other than using "os.listdir"

David Bolen db3l at fitlinxx.com
Thu Dec 30 12:39:19 EST 2004


Doran_Dermot at emc.com writes:

> I'm currently using "os.listdir" to obtain the contents of some slow Windows
> shares.  I think I've seen another way of doing this using the win32 library
> but I can't find the example anymore.

Do you want the list of files on the shares or the list of shares
itself?  If the files, you can use something like FindFiles, but I
don't expect it to be that much faster just to obtain directory names
(likely the overhead is on the network).

If you just want a list of shares, you could use NetUseEnum, which
should be pretty speedy.

(FindFiles is wrapped by win32api, and NetUseEnum by win32net, both parts
 of the pywin32 package)

Here's a short example of displaying equivalent output to the "net
use" command:

          - - - - - - - - - - - - - - - - - - - - - - - - -
import win32net

status = {0 : 'Ok',
          1 : 'Paused',
          2 : 'Disconnected',
          3 : 'Network Error',
          4 : 'Connected',
          5 : 'Reconnected'}

resume = 0
while 1:
    (results, total, resume) = win32net.NetUseEnum(None, 1, resume)
    for use in results:
        print '%-15s %-5s %s' % (status.get(use['status'], 'Unknown'),
                                 use['local'],
                                 use['remote'])
    if not resume:
        break
          - - - - - - - - - - - - - - - - - - - - - - - - -

Details on the the arguments to NetUseEnum can be found in MSDN (with
any pywin32 specifics in the pywin32 documentation).

> My main problem with using "os.listdir" is that it hangs my gui application.
> The tread running the "os.listdir" appears to block all other threads when
> it calls this function.

Yes, for a GUI you need to keep your main GUI thread always responsive
(e.g., don't do any blocking operations).

There are a number of alternatives to handling a long processing task
in a GUI application, dependent on both the operation and toolkit in
use.  For wxPython, http://wiki.wxpython.org/index.cgi/LongRunningTasks
covers several of the options (and the theory behind them is generally
portable to other toolkits although implementation will change).

-- David



More information about the Python-list mailing list