ipython / ipython/ipython

Navigator Unable to Browse Up Beyond a Volume Boundary on Windows

Open
#9,911 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
16.8k
Forks
4.5k
Avg merge
1d 2h
Merged PRs (30d)
6

Description

The navigator is unable to browse up the tree past the volume boundary on Windows.

Invoking `WindowsScanner.get_volume_ids()` from the following Python 2.7 code displays the current volumes on a Windows machine:

```
class VolumeTypes( object ):
NoType = 0
Unknown = 1
NoRootDirectory = 2
RemovableDisk = 4
LocalDisk = 8
NetworkDrive = 16
CompactDisc = 32
RamDisk = 64
AllTypes = Unknown | NoRootDirectory | RemovableDisk | LocalDisk | NetworkDrive | CompactDisc | RamDisk

@staticmethod
def get_types():
return [ VolumeTypes.NoType, VolumeTypes.Unknown, VolumeTypes.NoRootDirectory, VolumeTypes.RemovableDisk, VolumeTypes.LocalDisk, VolumeTypes.NetworkDrive, VolumeTypes.CompactDisc, VolumeTypes.RamDisk ]

@staticmethod
def get_wmi_value(type):
if type == VolumeTypes.Unknown:
result = 0
elif type == VolumeTypes.NoRootDirectory:
result = 1
elif type == VolumeTypes.RemovableDisk:
result = 2
elif type == VolumeTypes.LocalDisk:
result = 3
elif type == VolumeTypes.NetworkDrive:
result = 4
elif type == VolumeTypes.CompactDisk:
result = 5
elif type == VolumeTypes.RamDisk:
result = 6
else:
raise ValueError( "Volume type value '{}' has no WMI equivalent." % type )

return result

@staticmethod
def get_volume_type(wmi_type):
return VolumeTypes.get_types()[ wmi_type + 1 ]

class WindowsScanner( object ):
@staticmethod
def get_volumes( filter = None ):
if filter is None:
filter = VolumeTypes.AllTypes

import wmi
interface = wmi.WMI()

volumes = interface.Win32_LogicalDisk()
result = [ volume for volume in volumes if VolumeTypes.get_volume_type( volume.DriveType ) & filter != 0 ]

return result

@staticmethod
def get_occupied_volumes( filter = None ):
import os.path

result = [ volume for volume in WindowsScanner.get_volumes( filter ) if os.path.exists( volume.DriveType ) ]

return result

@staticmethod
def get_unoccupied_volumes( filter = None ):
import os.path

result = [ volume for volume in WindowsScanner.get_volumes( filter ) if not os.path.exists( volume.DriveType ) ]

return result

@staticmethod
def get_volume_ids( filter = None ):
return [ volume.DeviceID for volume in WindowsScanner.get_volumes( filter ) ]

@staticmethod
def get_occupied_volume_ids( filter = None ):
return [ volume.DeviceID for volume in WindowsScanner.get_occupied_volumes( filter ) ]

@staticmethod
def get_unoccupied_volume_ids( filter = None ):
return [ volume.DeviceID for volume in WindowsScanner.get_unoccupied_volumes( filter ) ]

```

I'm not sure where the code should be added, but the "Home" of the running notebook instance should probably be a location which allows for navigation across different volumes.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.