ipython / ipython/ipython

Navigator Unable to Browse Up Beyond a Volume Boundary on Windows

未关闭
#9,911 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
16.8k
派生
4.5k
平均合并
1 天 2 小时
30 天内合并 PR
6

描述

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.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。