我有一个要处理的Ruby脚本的文件列表。该脚本始终在Windows PC上运行。脚本如何找到实际名称?
示例:
File List -> Actual file on disk
TEST.TXT -> test.txt
TeSt.TxT -> test.txt
经过更多测试后我发现:
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
都没有做任何事情,而文件名都正确但不是路径名。
所以我编写了这个函数,但是它修正了路径名中的一些案例问题而不是其他案例。
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
似乎有点随意......
答案 0 :(得分:2)
你会期望方法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
修改
这是一个核心记录路径和文件名的版本。 似乎即使操作系统本身具有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