2011-11-14 28 views
7

Tôi muốn thực hiện một công cụ mà sẽ đưa một số tên tập tin như thông số, nhưng khi tôi sử dụng mã này:Làm thế nào để có được tên tập tin dài từ argv

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

và tôi sử dụng kéo và thả hoặc "gửi đến" trong Windows , Tôi lấy tên tập tin ngắn. Vì vậy, một tệp như "C:\Ruby193\bin\test\New Text Document.txt" trở thành C:\Ruby193\bin\test\NEWTEX~1.TXT làm đối số.

Không có vấn đề gì khi tôi chạy tập lệnh từ dòng lệnh, với tên dài là tham số.

Làm cách nào để lấy tên tệp dài khi tôi sử dụng kéo và thả hoặc gửi tới?

Trả lời

4

Tôi không biết nếu nó có thể thay đổi các tham số bạn nhận được trên một kéo và thả, nhưng bạn có thể sử dụng chức năng Win32 getLongPathName(), sử dụng Ruby Win32 bindings

--edit--
Bao gồm @ giải pháp peter của định dạng để có thể đọc:

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

đã tìm thấy nó trên http://www.varioustopics.com/ruby/518646-rre-ruby-cygwin-and-paths.html require 'tìm' 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 ') gọi (short_name, long_name, max_path) trả lại (1..max_path) .include? (Lfn_size)? long_name [0..lfn_size-1]: short_name kết thúc ARGV.each do | a | đặt số đặt get_long_win32_filename (a) kết thúc – 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

tôi học được rất nhiều cố gắng để tìm ra điều này!

Tuy nhiên, @peter đánh tôi với giải pháp đơn giản hơn nhiều.

Đây là của tôi, trong trường hợp ai đó thấy hữu ích. file_get_long_name.rb

Tôi có ý tưởng từ: một bài viết được lưu trữ vb-world.net và chuyển đổi nó thành 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

tôi thấy lý do kịch bản của tôi receaved tên tập tin ngắn, tôi đã làm một bản vá đăng ký để kích hoạt tính năng kéo và thả trên kịch bản ruby ​​và schortcuts như sau

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

Nhưng nó phải được như sau cho tên tập tin DÀI

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}" 
Các vấn đề liên quan