将长文件名转换为短文件名(8.3)

时间:2012-04-19 08:44:24

标签: ruby windows command-line long-filenames short-filenames

我想将长文件名/路径转换为短文件名(8.3)。 我正在开发一个调用命令行工具的脚本,该工具只接受短文件名。

所以我需要转换

C:\Ruby193\bin\test\New Text Document.txt

C:\Ruby193\bin\test\NEWTEX~1.TXT

到目前为止,我发现How to get long filename from ARGV使用WIN32API将短文件名转换为长文件名(与我想要实现的目标相反)。

有没有办法在Ruby中获取短文件名?

3 个答案:

答案 0 :(得分:3)

您可以使用FFI执行此操作;实际上有一个示例涵盖their wiki标题下的“将路径转换为8.3样式路径名”下的确切方案:

require 'ffi'

module Win
  extend FFI::Library
  ffi_lib 'kernel32'
  ffi_convention :stdcall

  attach_function :path_to_8_3, :GetShortPathNameA, [:pointer, :pointer, :uint], :uint
end
out = FFI::MemoryPointer.new 256 # bytes
Win.path_to_8_3("c:\\program files", out, out.length)
p out.get_string # be careful, the path/file you convert to 8.3 must exist or this will be empty

答案 1 :(得分:3)

此ruby代码使用 getShortPathName ,并且不需要安装其他模块。

def get_short_win32_filename(long_name)
    require 'win32api'
    win_func = Win32API.new("kernel32","GetShortPathName","PPL"," L")
    buf = 0.chr * 256
    buf[0..long_name.length-1] = long_name
    win_func.call(long_name, buf, buf.length)
    return buf.split(0.chr).first
end

答案 2 :(得分:1)

您需要的Windows功能是GetShortPathName。您可以按照链接帖子中描述的相同方式使用它。

编辑:GetShortPathName的示例用法(仅作为一个简单示例) - 短名称将包含“C:\ LONGFO~1 \ LONGFI~1.TXT”,返回值为24.

TCHAR* longname = "C:\\long folder name\\long file name.txt";
TCHAR* shortname = new TCHAR[256];
GetShortPathName(longname,shortname,256);