rubywindowscommand-linelong-filenamesshort-filenames

Convert long filename to short filename (8.3)


I want to convert long filenames/path to short filenames (8.3). I'm developing a script that calls a command line tool that only accepts short filenames.

So i need to convert

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

to

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

So far i found How to get long filename from ARGV which uses WIN32API to convert short to long filenames (the opposite of what I want to achieve).

Is there any way to get the short filename in Ruby?


Solution

  • This ruby code uses getShortPathName and don't need additional modules to be installed.

    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