转换长文件名短文件名(8.3)(Convert long filename to short fil

2019-09-16 15:34发布

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

所以,我需要转换

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

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

到目前为止,我发现如何从ARGV长文件名 ,它使用WIN32API将短到长文件名(什么,我要实现的对面)。

有没有什么办法让Ruby中短文件名?

Answer 1:

为此,您可以使用FFI ; 实际上,有一个覆盖确切的情况在示例中他们维基标题下的“转换为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


Answer 2:

该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


Answer 3:

你需要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);


文章来源: Convert long filename to short filename (8.3)