在Windows上查找ruby文件的真实文件名

我有一个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_pathDir["#{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