2011-11-14 14 views
7

से बड़ा फ़ाइल नाम पाने के लिए मैं एक उपकरण है जो पैरामीटर के रूप में कुछ फ़ाइल नाम लेता है बनाना चाहते, लेकिन जब मैं इस कोड का उपयोग:कैसे ARGV

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

अगर यह संभव है तर्क आप एक खींचें और ड्रॉप पर प्राप्त बदलने के लिए मैं नहीं जानता, लेकिन आप Win32 getLongPathName() समारोह इस्तेमाल कर सकते हैं, Ruby Win32 bindings

--edit--
सहित का उपयोग कर @ पीटर के समाधान पठनीयता के लिए स्वरूपित:

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

http://www.varioustopics.com/ruby/518646-rre-ruby-cygwin-and-paths.html पर मिला 210 की आवश्यकता होती है 'लगता है' 'fileutils' की आवश्यकता होती है 'Win32API' डीईएफ़ get_long_win32_filename (short_name) MAX_PATH = 1024 long_name = "" * MAX_PATH lfn_size = Win32API.new ("kernel32", "GetLongPathName", [ ' की आवश्यकता होती है पी ',' पी ',' एल '],' एल ')। कॉल (short_name, long_name, max_path) वापसी (1..max_path)। शामिल करें? (Lfn_size)? long_name [0..lfn_size-1]: लघु_नाम अंत ARGV.each do | a | डालता है get_long_win32_filename (ए) अंत – 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

मैं इसे समझने की कोशिश कर बहुत कुछ सीखा!

हालांकि, @ पीटर ने मुझे एक बहुत ही सरल समाधान के साथ इसे हरा दिया।

यहां मेरा है, अगर किसी को यह उपयोगी लगता है। file_get_long_name.rb

मुझे यह विचार मिला: एक संग्रहीत vb-world.net आलेख और इसे रूबी में परिवर्तित कर दिया गया।

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

मैं कारण मेरी स्क्रिप्ट लघु फ़ाइल नाम receaved पाया, मैं के रूप में

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

इस प्रकार खींचें सक्षम और गहरे लाल रंग का स्क्रिप्ट और schortcuts पर ड्रॉप करने के लिए एक रजिस्ट्री पैच किया था लेकिन यह निम्न होना ही था लंबे फ़ाइल नामों के लिए

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}" 
संबंधित मुद्दे