Displaying Volume Paths

本文提供了一个C++示例程序,用于展示系统中每个卷及其设备的所有路径。通过调用Windows API函数,该程序能够获取卷名对应的设备名称及所有路径,并将这些路径打印出来。
Displaying Volume Paths
 
 

The following C++ example shows how to display all paths for each volume and device. For each volume in the system, the example locates the volume, obtains the device name, obtains all paths for that volume, and displays the paths.

 

  1. #include <windows.h>
  2. #include <stdio.h>
  3. void DisplayVolumePaths(
  4.         __in PWCHAR VolumeName
  5.         )
  6. {
  7.     DWORD  CharCount = MAX_PATH + 1;
  8.     PWCHAR Names     = NULL;
  9.     PWCHAR NameIdx   = NULL;
  10.     BOOL   Success   = FALSE;
  11.     for (;;) 
  12.     {
  13.         //
  14.         //  Allocate a buffer to hold the paths.
  15.         Names = (PWCHARnew BYTE [CharCount * sizeof(WCHAR)];
  16.         if ( !Names ) 
  17.         {
  18.             //
  19.             //  If memory can't be allocated, return.
  20.             return;
  21.         }
  22.         //
  23.         //  Obtain all of the paths
  24.         //  for this volume.
  25.         Success = GetVolumePathNamesForVolumeNameW(
  26.             VolumeName, Names, CharCount, 
  27.             );
  28.         if ( Success ) 
  29.         {
  30.             break;
  31.         }
  32.         if ( GetLastError() != ERROR_MORE_DATA ) 
  33.         {
  34.             break;
  35.         }
  36.         //
  37.         //  Try again with the
  38.         //  new suggested size.
  39.         delete [] Names;
  40.         Names = NULL;
  41.     }
  42.     if ( Success )
  43.     {
  44.         //
  45.         //  Display the various paths.
  46.         for ( NameIdx = Names; 
  47.               NameIdx[0] != L'/0'
  48.               NameIdx += wcslen(NameIdx) + 1 ) 
  49.         {
  50.             wprintf(L"  %s", NameIdx);
  51.         }
  52.         wprintf(L"/n");
  53.     }
  54.     if ( Names != NULL ) 
  55.     {
  56.         delete [] Names;
  57.         Names = NULL;
  58.     }
  59.     return;
  60. }
  61. void __cdecl wmain(void)
  62. {
  63.     DWORD  CharCount            = 0;
  64.     WCHAR  DeviceName[MAX_PATH] = L"";
  65.     DWORD  Error                = ERROR_SUCCESS;
  66.     HANDLE FindHandle           = INVALID_HANDLE_VALUE;
  67.     BOOL   Found                = FALSE;
  68.     size_t Index                = 0;
  69.     BOOL   Success              = FALSE;
  70.     WCHAR  VolumeName[MAX_PATH] = L"";
  71.     //
  72.     //  Enumerate all volumes in the system.
  73.     FindHandle = FindFirstVolumeW(VolumeName, ARRAYSIZE(VolumeName));
  74.     if (FindHandle == INVALID_HANDLE_VALUE)
  75.     {
  76.         Error = GetLastError();
  77.         wprintf(L"FindFirstVolumeW failed with error code %d/n", Error);
  78.         return;
  79.     }
  80.     for (;;)
  81.     {
  82.         //
  83.         //  Skip the //?/ prefix and remove the trailing backslash.
  84.         Index = wcslen(VolumeName) - 1;
  85.         if (VolumeName[0]     != L'//' ||
  86.             VolumeName[1]     != L'//' ||
  87.             VolumeName[2]     != L'?'  ||
  88.             VolumeName[3]     != L'//' ||
  89.             VolumeName[Index] != L'//'
  90.         {
  91.             Error = ERROR_BAD_PATHNAME;
  92.             wprintf(L"FindFirstVolumeW/FindNextVolumeW returned a bad path: %s/n", VolumeName);
  93.             break;
  94.         }
  95.         //
  96.         //  QueryDosDeviceW doesn't allow a trailing backslash,
  97.         //  so temporarily remove it.
  98.         VolumeName[Index] = L'/0';
  99.         CharCount = QueryDosDeviceW(&VolumeName[4], DeviceName, ARRAYSIZE(DeviceName)); 
  100.         VolumeName[Index] = L'//';
  101.         if ( CharCount == 0 ) 
  102.         {
  103.             Error = GetLastError();
  104.             wprintf(L"QueryDosDeviceW failed with error code %d/n", Error);
  105.             break;
  106.         }
  107.         wprintf(L"/nFound a device:/n %s", DeviceName);
  108.         wprintf(L"/nVolume name: %s", VolumeName);
  109.         wprintf(L"/nPaths:");
  110.         DisplayVolumePaths(VolumeName);
  111.         //
  112.         //  Move on to the next volume.
  113.         Success = FindNextVolumeW(FindHandle, VolumeName, ARRAYSIZE(VolumeName));
  114.         if ( !Success ) 
  115.         {
  116.             Error = GetLastError();
  117.             if (Error != ERROR_NO_MORE_FILES) 
  118.             {
  119.                 wprintf(L"FindNextVolumeW failed with error code %d/n", Error);
  120.                 break;
  121.             }
  122.             //
  123.             //  Finished iterating
  124.             //  through all the volumes.
  125.             Error = ERROR_SUCCESS;
  126.             break;
  127.         }
  128.     }
  129.     FindVolumeClose(FindHandle);
  130.     FindHandle = INVALID_HANDLE_VALUE;
  131.     return;
  132. }

The following is example output from running the application. For each volume, the output includes a volume device path, a volume GUID path, and a drive letter.

 

 

Found a device:
 /Device/HarddiskVolume2
Volume name: //?/Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963}/
Paths:  C:/

Found a device:
 /Device/CdRom0
Volume name: //?/Volume{4c1b02c4-d990-11dc-99ae-806e6f6e6963}/
Paths:  D:/
See also http://msdn.microsoft.com/en-us/library/aa365730(VS.85).aspx
根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
<think>好的,用户遇到了在Jupyter中实现班组筛选和域账号提取时出现的“Error displaying widget”问题。首先,我需要回忆一下之前给出的解决方案,然后分析可能导致这个错误的原因。 用户之前的代码使用了ipywidgets库中的Dropdown、SelectMultiple等控件,并通过VBox布局来显示。出现错误显示控件的问题,通常有几个常见原因: 1. **缺少必要的Jupyter扩展**:ipywidgets需要正确的扩展支持,尤其是在Jupyter Notebook中,可能需要启用特定的插件。如果用户没有安装或启用这些扩展,控件可能无法正确渲染。 2. **内核未正确重启**:有时候安装新库后,需要重启内核才能生效。如果用户安装了ipywidgets但没有重启内核,可能导致控件无法显示。 3. **代码结构问题**:控件的创建和显示顺序是否正确?例如,是否在正确的位置调用了display函数?或者是否在函数内部错误地创建了控件? 4. **版本兼容性问题**:ipywidgets与Jupyter的版本是否兼容?较旧的版本可能存在bug,导致控件无法正常显示。 接下来,我需要考虑用户可能没有提到的细节。例如,用户是否在本地运行Jupyter,还是使用在线环境如Google Colab?不同的环境可能需要不同的配置步骤。另外,用户是否在安装ipywidgets后执行了正确的配置命令,比如jupyter nbextension enable? 另外,代码中的某些部分可能导致错误。例如,是否在更新成员列表的回调函数中正确处理了change参数?或者是否在数据筛选时出现了KeyError,导致控件无法正确初始化? 还需要考虑用户的数据结构是否正确。比如,数据中的列名是否确实为“班组”、“姓名”、“域账号”,是否有空格或大小写不一致的问题?如果列名不匹配,会导致数据筛选失败,进而影响控件的选项更新。 再者,用户是否在Jupyter中正确安装了ipywidgets?如果只是用pip安装了库,但未启用前端扩展,控件可能无法显示,从而导致错误。 最后,可能需要建议用户分步调试,比如先单独测试控件的显示,再逐步添加功能,以定位问题出现的具体环节。</think>在Jupyter Notebook中遇到"Error displaying widget"问题通常与组件渲染环境配置有关,以下是完整解决方案: ### 一、问题根源分析 1. **组件依赖缺失**:ipywidgets需要Jupyter扩展支持[^1] 2. **内核未更新**:安装新包后未重启内核 3. **渲染模式错误**:未启用正确的前端渲染模式 ### 二、分步解决方案 #### 步骤1:安装必要组件 ```bash # 在Jupyter终端执行 pip install ipywidgets jupyter nbextension enable --py widgetsnbextension --sys-prefix ``` #### 步骤2:验证环境配置 ```python import ipywidgets as widgets print("版本:", widgets.__version__) # 需 >=8.0.0 widgets.IntSlider().display() # 测试基础组件渲染能力 ``` #### 步骤3:修正后的完整代码 ```python import pandas as pd from ipywidgets import Dropdown, SelectMultiple, Output, VBox, Button from IPython.display import display, clear_output # 初始化环境(必须放在代码首部) %matplotlib inline # 创建数据示例(替换为实际数据源) data = { '姓名': ['张三', '李四', '王五', '赵六'], '班组': ['A组', 'B组', 'A组', 'B组'], '域账号': ['zhangsan; zs', 'lisi; ls', 'wangwu; ww', 'zhaoliu; zl'] } df = pd.DataFrame(data) # 创建带容错机制的控件 class SafeDropdown(Dropdown): def __init__(self, **kwargs): kwargs.setdefault('options', []) super().__init__(**kwargs) 班组选择 = SafeDropdown(description="选择班组:", options=df['班组'].unique().tolist()) 成员选择 = SelectMultiple(description="选择成员:", options=[], disabled=False) 输出显示 = Output() 提取按钮 = Button(description="提取域账号", button_style='success') # 动态更新逻辑(增加异常处理) def 更新成员列表(change): try: with 输出显示: 输出显示.clear_output() 班组 = change.new 当前班组成员 = df[df['班组'] == 班组]['姓名'].tolist() 成员选择.options = 当前班组成员 if 当前班组成员 else ['无成员'] except Exception as e: print(f"更新异常: {str(e)}") 班组选择.observe(更新成员列表, names='value') # 提取功能强化版 def 提取账号(_): try: 班组 = 班组选择.value 选中成员 = [m for m in 成员选择.value if m != '无成员'] if not 选中成员: raise ValueError("请至少选择一个有效成员") 结果 = df[(df['班组'] == 班组) & (df['姓名'].isin(选中成员))]['域账号'] 格式化结果 = "; ".join(结果.astype(str)) with 输出显示: clear_output() display(f"✅ 提取成功: {格式化_result}") except Exception as e: with 输出显示: clear_output() display(f"❌ 错误: {str(e)}") 提取按钮.on_click(提取账号) # 界面渲染(必须使用display函数) display(VBox([ 班组选择, 成员选择, 提取_button, 输出显示 ]), display_id='main_widget') ``` ### 三、关键增强点 1. 增加`%matplotlib inline`魔法命令强制初始化渲染环境 2. 使用继承方式创建带默认值的`SafeDropdown`控件[^2] 3. 异常处理覆盖所有数据操作环节 4. 增加状态反馈标识(✅/❌) 5. 强制指定display_id防止组件冲突 ### 四、常见错误处理表 | 错误现象 | 解决方案 | |---------|----------| | 控件完全空白 | 执行`jupyter nbextension list`确认widgetsnbextension显示"enabled" | | 仅显示静态文本 | 检查是否遗漏`display()`函数调用 | | 交互后界面冻结 | 在代码首部添加`%matplotlib widget` | | 选项更新延迟 | 添加`@output.capture()`装饰器捕获输出 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值