我有一个Ruby脚本文件的列表来处理。 脚本始终在Windows PC上运行。 脚本如何find实际的名字?
例:
File List -> Actual file on disk TEST.TXT -> test.txt TeSt.TxT -> test.txt
经过更多的testing,我发现:
puts File.absolute_path("./TEST.RB") puts Dir["./TEST.RB*"].first #Path as on disk puts File.absolute_path("./../Vdd/TEST.RB") puts Dir["./../Vdd/TEST.RB*"].first #Path case not as on disk puts File.absolute_path("./../vdd/TEST.RB") puts Dir["./../vdd/TEST.RB*"].first
输出
C:/Projects/xcms/software-HEAD/build/tools/Vdd/test.rb ./test.rb C:/Projects/xcms/software-HEAD/build/tools/Vdd/test.rb ./../Vdd/test.rb C:/Projects/xcms/software-HEAD/build/tools/vdd/test.rb ./../vdd/test.rb
所以realpath
什么也不做,而absolute_path
和Dir["#{file}*"].first
都是正确的文件名,而不是path名。
所以我写了这个函数,但它纠正了path名中的一些案例问题,而不是其他的。
def actual_absolute_path(file) file = File.absolute_path(file) filename = '' file.split('/').each do |s| filename = File.absolute_path(filename + s + "/") + "/" end filename[0 ..-2] end
这似乎有点随意…
你会期望realpath的方法会给你,但它不是你可以使用这个技巧,真正的名字是全部小写的。
file = 'C:/Users/Gebruiker/ruby_werk/files/REAL_NAME1.rb' p File.realpath file p Dir["#{file}*"].first
给
"C:/Users/Gebruiker/ruby_werk/files/REAL_NAME1.rb" # not correct "C:/Users/Gebruiker/ruby_werk/files/real_name1.rb" # correct
编辑
这里有一个版本corercts路径和文件名。 似乎即使操作系统本身与DIR / B / S认为你认为你提供了它,并不纠正案件。 所以我把路径转换成一个简称,然后再转换成长名。
require 'Win32API' file = 'c:/users/gebruiker/ruby_werk/files/REAL_NAME1.rb' def longname 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 long_name[0..lfn_size-1] end def shortname long_name max_path = 1024 short_name = " " * max_path lfn_size = Win32API.new("kernel32", "GetShortPathName", ['P','P','L'],'L').call(long_name, short_name, max_path) return short_name[0..lfn_size-1] end def realname file longname(shortname file) end p realname file
给
C:/Users/Gebruiker/ruby_werk/files/real_name1.rb