当前位置: 首页 > 面试题库 >

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

聂煜
2023-03-14
问题内容

我需要根据我的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

不幸的是,为此,我需要安装pywin32ActivePython在我的情况下无法安装。


问题答案:

您可以使用ctypes。根据MSDN上的文档,GetShortPathName位于中KERNEL32.DLL。需要注意的是真正的功能是GetShortPathNameW用于
W¯¯
IDE(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问题,返回值仍然较大,请继续尝试直到正确为止。所以:

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


 类似资料:
  • 问题内容: 假设我有两个模块: a.py: b.py: 我运行“ a.py”文件。打印: 问题 :如何从“ b.py”库中获取模块的路径(在本例中为“ a.py”)? 问题答案:

  • 问题内容: 给定路径,例如,我如何找到相对于Python中当前工作目录的文件的绝对路径?例如在Windows上,我可能会得到以下结果: 问题答案: 如果已经是绝对路径,也可以使用:

  • 问题内容: 给定Python中的类C,如何确定该类在哪个文件中定义?我需要可以从类C或从关闭C的实例工作的东西。 我这样做的原因是因为我通常不喜欢将属于同一文件的文件放在同一文件夹中。我想创建一个使用Django模板将其自身呈现为HTML的类。基本实现应根据定义类的文件名来推断模板的文件名。 假设我在文件“ base / artifacts.py”中放置了一个LocationArtifact类,那

  • 问题内容: 我要获取exe / dll / sys文件的“文件描述”和“版权”,如右键单击文件并选择属性时,在“详细信息”选项卡中所示。 问题答案: 使用Windows API,您可以调用VerQueryValue以获取该信息。JNA有一个用于访问此API的类,称为Version。 这另一个问题有一些代码示例可以帮助您入门: 获取.exe的版本信息 这是一个读取产品名称的C代码示例,您可以将其转换

  • 问题内容: 在Python中,我应该使用哪个命令来获取包含正在使用的文件的文件夹的名称? 这就是我想要得到的。 我唯一想出的就是使用两次: 有什么更好的方法吗? 问题答案: 您可以使用: 返回路径名path的目录名。这是通过将路径传递给函数split()返回的对中的第一个元素。 给定完整路径,然后您可以正常拆分以获取路径的最后一部分。例如,通过使用: 返回路径名path的基本名称。这是通过将路径传

  • 所以我要做的是让我的Java找到windows用来登录的用户名,所以当我说这样的方法时,它会返回用户名,就像我在名为Noah的用户中使用它一样,Java会返回“Noah”,如果我在用户Amanda上,Java会返回“Amanda”。我该怎么做?