如何在python中获取Windows短文件名?

2024-04-23

我需要从我的 python 代码中确定 Windows 短文件名。为此,我可以使用 win32api 找到解决方案。

import win32api
long_file_name='C:\Program Files\I am a file'
short_file_name=win32api.GetShortPathName(long_file_name)

参考:http://blog.lowkster.com/2008/10/spaces-in-directory-names-i-really-love.html http://blog.lowkster.com/2008/10/spaces-in-directory-names-i-really-love.html

不幸的是我需要安装pywin32 or ActivePython这对我来说是不可能的。

还参考了SO:

在Python中获取短路径:在python中获取短路径 https://stackoverflow.com/questions/6085688/getting-short-path-in-python


您可以使用ctypes https://docs.python.org/3/library/ctypes.html。根据MSDN 上的文档 http://msdn.microsoft.com/en-us/library/aa364989.aspx, GetShortPathName is in KERNEL32.DLL。请注意,实际函数是GetShortPathNameW for wide (Unicode) 字符和GetShortPathNameA对于单字节字符。由于宽字符更通用,我们将使用该版本。首先根据文档设置原型:

import ctypes
from ctypes import wintypes
_GetShortPathNameW = ctypes.windll.kernel32.GetShortPathNameW
_GetShortPathNameW.argtypes = [wintypes.LPCWSTR, wintypes.LPWSTR, wintypes.DWORD]
_GetShortPathNameW.restype = wintypes.DWORD

GetShortPathName通过首先在没有目标缓冲区的情况下调用它来使用。它将返回创建目标缓冲区所需的字符数。然后,您可以使用该大小的缓冲区再次调用它。如果,由于一个TOCTTOU https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use问题,返回值还是比较大,继续尝试,直到做对为止。所以:

def get_short_path_name(long_name):
    """
    Gets the short path name of a given long path.
    http://stackoverflow.com/a/23598461/200291
    """
    output_buf_size = 0
    while True:
        output_buf = ctypes.create_unicode_buffer(output_buf_size)
        needed = _GetShortPathNameW(long_name, output_buf, output_buf_size)
        if output_buf_size >= needed:
            return output_buf.value
        else:
            output_buf_size = needed
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在python中获取Windows短文件名? 的相关文章

随机推荐

  • 如何在滚动时实现图像淡入效果(如 mashable.com)

    我想知道 mashable com 上图像的淡入效果 请参阅http mashable com 2009 08 14 google android logo remixes http mashable com 2009 08 14 goog
  • Ember:断言失败:EmberObject.create 不再支持定义计算属性

    我使用的是 Ember 2 16 版本 我们升级到了 3 8 版本升级后 我看到此错误 但无法弄清楚错误来自何处 在什么情况下我会收到此错误 我看到其中一篇帖子 Ember JS 中的动态计算属性已弃用 https stackoverflo
  • 使用 php 和 mysql 将多个复选框值存储到数据库

    我想将多个复选框值存储在单个字段中 我使用该链接http www mindfiresolutions com Storing array data to MySQL using PHP 1296 php http www mindfires
  • 如何在不存储 TypeScript 的情况下进行内联类型检查?

    我有一些界面 ITestInterface foo string 我想将此接口的实例作为参数传递给函数 该函数将采用任何对象类型 因此它本身不会进行类型检查 为了确保对象的类型正确 我可以使用存储 const passMe ITestInt
  • 布尔变量不是默认总是 false 吗?

    我声明了一个布尔变量bool abc 在一个类中 并认为默认情况下它是错误的 一个if我的程序中的条件 if abc 结果是true 所以我输出abc的值 看到它包含值55 这正常吗 我们是否总是必须分配 bool abc false 以确
  • Action Filter 中的 UnitOfWork 似乎正在缓存

    我有一个使用 IoC Unity 的 MVC 3 站点 我的模型是使用 EF4 和 POCO 生成的 我正在使用操作过滤器来提交我的工作单元 public class UseUnitOfWorkAttribute ActionFilterA
  • App.config - 加密部分错误:

    我有一个对配置文件中的部分进行加密的应用程序 当我第一次尝试从配置文件中读取加密部分时 我收到一条错误消息 无法识别的属性 configProtectionProvider 请注意 属性名称区分大小写 config Configuratio
  • 如何删除选中时覆盖 UITabBarItem 的蓝色方块?

    我有一个 iPad 应用程序 Xcode 5 iOS 7 ARC 和 Storyboards 我有一个UITabBarController 并且每个场景都有一个UITabBarItem 当我点击选项卡栏项目时 它会转到正确的场景 但 当前
  • 如何列出拥有活跃订阅者的所有 pubnub 频道?

    我想列出与具有活跃订阅者的订阅密钥关联的所有频道 有没有办法用 pubnub 做到这一点 如果这有什么区别的话 我正在使用 JavaScript API PubNub 现在 API 返回与订阅键关联的频道列表 其中存在订阅者 PUBNUB
  • ASP.NET 5 MVC6 User.GetUserId() 返回错误的 ID

    我在 ASP NET 5 中有一个简单的项目 只有一个注册用户 我尝试通过扩展方法获取当前登录用户的IDGetUserId from using System Security Claims命名空间 不幸的是 这个方法返回给我不存在的ID
  • 数据表选择前5行

    您好 有什么方法可以从数据表中选择前 5 行而不进行迭代吗 我认为 你可以使用 LINQ datatable AsEnumerable Take 5
  • 编译动态内容 - AngularJS

    我正在重写这个问题 因为我认为原来的问题不太清楚 基本上 我有一个 包装器 指令 我试图将属性动态添加到包装 嵌入 元素之一 我可以让它工作 但 Angular 似乎不知道添加后的新属性 如果我使用 compile那么 Angular 确实
  • 有没有一种简单的方法对编译器输出进行颜色编码?

    gcc 或其他编译器 经常生成大量文本输出 并且很难看出错误在哪里或错过警告 我已经做了一些搜索 但还没有找到一个干净简单的解决方案来对编译器输出进行颜色编码 例如警告是黄色 错误是红色等 gcc 4 9好像添加了这个功能 https gc
  • 我可以从 FoxPro 通用字段中提取文件吗?

    我正在将 VFP 9 应用程序移植到 SQL Server VFP 应用程序有一些表 其中包含 常规 字段 查询字段时我得到一个字节数组 当我将它保存到磁盘时 我可以查看里面并看到它是一个Word文档 或者一个Paint BMP等 通过阅读
  • 规范哈夫曼编码算法

    你好 我正在尝试实现 Canonical huffman 编码 但我不明白 wiki 和 google 指南 我需要更抽象地解释 我试过这个 1 获取常规哈夫曼编码长度的代码列表 像这样 A code 110 length 3 B code
  • lambda 可以使用 *args 作为参数吗? [复制]

    这个问题在这里已经有答案了 我正在使用计算总和lambda像这样 def my func args return reduce lambda x y x y args my func 1 2 3 4 它的输出是10 但我想要一个lambda
  • 我可以在运行时选择一个特征对象而不使用 Box 吗?

    我想分支并决定在运行时在函数中使用的 Trait 实现 请参阅poly read在下面的代码示例中 Trait 对象是在 if 表达式的分支臂内部构造的 并且只需要在 if 表达式的生命周期内存在poly read但我需要Box它是因为无法
  • 无法更新 EntitySet '...',因为它有 DefiningQuery

    我将 MVC 4 和 C 4 5 与 EntityFramework 4 一起使用 我设置了一个简单的多对多表 tblAdminUser gt tblAdminUserRole lt tblAdminRole 当我尝试向管理员用户添加角色时
  • 反射真的那么慢以至于我不应该在有意义的时候使用它吗? [复制]

    这个问题在这里已经有答案了 可能的重复 NET 反射的成本有多高 https stackoverflow com questions 25458 how costly is net reflection 优雅 的解决方案problem ht
  • 如何在python中获取Windows短文件名?

    我需要从我的 python 代码中确定 Windows 短文件名 为此 我可以使用 win32api 找到解决方案 import win32api long file name C Program Files I am a file sho