2011-11-14 16 views
7

Chcę uczynić narzędzie, które ma kilka nazw jak parametry, ale kiedy używam tego kodu:Jak zdobyć długą nazwę pliku z ARGV

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

i używam przeciągnij i upuść lub „wyślij do” w systemie Windows , Dostaję krótką nazwę pliku. Plik taki jak "C:\Ruby193\bin\test\New Text Document.txt" staje się C:\Ruby193\bin\test\NEWTEX~1.TXT jako argumentem.

Nie ma problemu, gdy uruchamiam skrypt z wiersza poleceń, a longfilenames jako parametry.

Jak uzyskać długą nazwę pliku, gdy używam przeciągania i upuszczania lub wysyłania do?

Odpowiedz

4

Nie wiem, czy jest możliwe, aby zmienić argument Państwo otrzymywać na przeciągnij i upuść, ale można korzystać z funkcji Win32 getLongPathName(), używając Ruby Win32 bindings

--edit--
łącznie z @ rozwiązanie piotra sformatowany dla czytelności:

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

znalazles go na http://www.varioustopics.com/ruby/518646-rre-ruby-cygwin-and-paths.html wymaga 'odnaleźć' wymagają 'fileutils' wymagają '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 koniec ARGV.each do | a | stawia umieszcza get_long_win32_filename (a) koniec – peter

5

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 
0

I wiele się nauczyłem, próbując to rozgryźć!

Jednak @peter pobił mnie tym znacznie prostszym rozwiązaniem.

Oto moje, na wypadek gdyby ktoś uznał to za przydatne. file_get_long_name.rb

Wpadłem na pomysł z: zarchiwizowanego artykułu vb-world.net i przekonwertowałem go na 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 
    longpath 
end 


fso = 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" 
0

znalazłem przyczynę mój skrypt receaved krótkich nazw plików, zrobiłem łatkę rejestru w celu umożliwienia przeciągania i upuszczania na skryptach Ruby i schortcuts następująco

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}" 

Ale to musiało być następujące dla długich nazw

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}" 
Powiązane problemy