How to get long filename from ARGV How to get long filename from ARGV windows windows

How to get long filename from ARGV


http://www.varioustopics.com/ruby/518646-rre-ruby-cygwin-and-paths.html

require 'find'require 'fileutils'require 'Win32API'def get_long_win32_filename(short_name)  max_path = 1024  long_name = " " * max_path  lfn_size = Win32API.new("kernel32", "GetLongPathName",     ['P','P','L'],'L').call(short_name, long_name, max_path)  return (1..max_path).include?(lfn_size) ? long_name[0..lfn_size-1] :  short_nameendARGV.each do|a|  puts a  puts get_long_win32_filename(a)end


I don't know if it is possible to change the argument you recieve on a drag and drop, but you could use the Win32 getLongPathName() function, using the Ruby Win32 bindings

--edit--
Including @peter's solution formatted for readability:

require 'find'require 'fileutils'require 'Win32API'def get_long_win32_filename(short_name)  max_path = 1024  long_name = " " * max_path  lfn_size = Win32API.new("kernel32",       "GetLongPathName", ['P','P','L'],'L').call(short_name, long_name, max_path)  return (1..max_path).include?(lfn_size) ? long_name[0..lfn_size-1] : short_nameend ARGV.each do|a|  puts a  puts get_long_win32_filename(a)end


I learned a lot trying to figure this out!

However, @peter beat me to it with a much simpler solution.

Here is mine, in case someone finds it useful. file_get_long_name.rb

I got the idea from: an archived vb-world.net article and converted it to ruby.

require 'win32ole'def get_long_filename(shortpath, fso = WIN32OLE.new("Scripting.FileSystemObject"))  path = case  when fso.FolderExists(shortpath)    fso.GetFolder(fso.GetAbsolutePathName(shortpath))  when fso.FileExists(shortpath)    fso.GetFile(fso.GetAbsolutePathName(shortpath))  else    return nil  end    parts = path.Path.split(/\\/)  working = fso.GetDrive(parts.shift).RootFolder  longpath = working.Path  parts.each do |part|    temppath = fso.BuildPath(longpath, part)    working = fso.GetFolder(longpath)    if fso.FolderExists(temppath)      working.SubFolders.each do |sub|        longpath = fso.BuildPath(longpath, sub.Name) if part== sub.ShortName || part == sub.Name      end    elsif fso.FileExists(temppath)      working.Files.each do |sub|        longpath = fso.BuildPath(longpath, sub.Name) if part== sub.ShortName || part == sub.Name      end    end  end  longpathendfso = WIN32OLE.new("Scripting.FileSystemObject")short = "C:\\DOCUME~1\\jamal\\Desktop\\NEWTEX~1.TXT"long = get_long_filename(short, fso)p long# ==> "C:\\Documents and Settings\\jamal\\Desktop\\New Text Document.txt"