Как получить длинное имя файла от ARGV - PullRequest
7 голосов
/ 15 ноября 2011

Я хочу сделать инструмент, который принимает некоторые имена файлов в качестве параметров, но когда я использую этот код:

ARGV.each do|a|
  puts "Argument: #{a}"
end

и я использую перетаскивание или «отправить» в Windows, я получаю короткое имя файла. Таким образом, файл типа "C:\Ruby193\bin\test\New Text Document.txt" становится C:\Ruby193\bin\test\NEWTEX~1.TXT в качестве аргумента.

Нет проблем при запуске сценария из командной строки с длинными именами файлов в качестве параметров.

Как получить длинное имя файла, когда я использую перетаскивание или отправку?

Ответы [ 4 ]

5 голосов
/ 16 ноября 2011

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_name
end

ARGV.each do|a|
  puts a
  puts get_long_win32_filename(a)
end
4 голосов
/ 16 ноября 2011

Я не знаю, возможно ли изменить аргумент, который вы получаете при перетаскивании, но вы можете использовать функцию Win32 getLongPathName(), используя Ruby Win32 привязки

- изменить -
Включая решение @ peter, отформатированное для удобства чтения:

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_name
end 

ARGV.each do|a|
  puts a
  puts get_long_win32_filename(a)
end
0 голосов
/ 09 ноября 2012

Я нашел причину, по которой мой сценарий получил короткие имена файлов, я сделал исправление реестра, чтобы включить перетаскивание на сценарии ruby ​​и ярлыки следующим образом

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\rbfile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"

[HKEY_CLASSES_ROOT\rbwfile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"

[HKEY_CLASSES_ROOT\RubyFile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"

[HKEY_CLASSES_ROOT\RubyWFile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"

Но для длинных имен файлов это должно быть следующим

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\rbfile\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

[HKEY_CLASSES_ROOT\rbwfile\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

[HKEY_CLASSES_ROOT\RubyFile\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

[HKEY_CLASSES_ROOT\RubyWFile\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"
0 голосов
/ 16 ноября 2011

Я многому научился, пытаясь это выяснить!

Однако @peter обошел меня гораздо более простым решением.

Вот мое, на случай, если кто-то сочтет это полезным. file_get_long_name.rb

Я получил идею из: заархивированной vb-world.net статьи и преобразовал ее в рубин.

...