不区分大小写的文件存在命令

时间:2013-03-05 08:41:30

标签: tcl eggdrop

嗯,不知道在这方面该做些什么。不久之前,我为eggdrop bot修改了一个日志记录脚本..但是现在一个问题展开了,由于某些原因,由于字符大小写的问题,它将操作/文本记录在单独的文件中。 #channel.html#Channel.html一样存在file exists 'filename_here',但前者是由于频道名称的当前状态而写入的(如果所有用户都离开,并且一个用不同的情况重新加入,则可以更改)。

我已将此问题缩小到我认为的问题。 {{1}}。我查看了tcl的文档,并且我已经阅读了关于混合大小写文件名的wiki(当然它将它们视为不同的文件),但我还没有找到允许这样的选项(或用户制作的proc)我要禁用此行为。

有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

这实际上取决于文件系统(即操作系统),因为file exists只是操作系统基本文件存在测试的一个薄包装器。经典的Unix文件系统大多区分大小写,而Windows文件系统通常不区分大小写。这意味着通常最好编写代码以小心处理事物的情况;您可能应该考虑使用string tolower在预期的情况下获取通道名称(因为我认为IRC通道名称不区分大小写)。

但是如果你不能这样做,你可以做的最好的事情就是得到不区分大小写的文件名列表,并检查这是否是单个值。唉,这是一个混乱的操作,因为glob没有-nocase选项(人们很少想要这样的事情),所以我们需要使用string match -nocase帮助:< / p>

set files [lmap f [glob *.html] {
    expr {[string match -nocase ${channel}.html $f] ? $f : [continue]}
}]
if {[llength $files] == 1} {
    set channel_file [lindex $files 0]
} else {
    # Oh no! Ambiguity!
}

使用来自Tcl 8.6的lmap;早期版本的Tcl应该使用它:

set files {}
foreach f [glob *.html] {
    if {[string match -nocase ${channel}.html $f]} {
        lappend files $f
    }
}
if {[llength $files] == 1} {
    set channel_file [lindex $files 0]
} else {
    # Oh no! Ambiguity!
}

答案 1 :(得分:1)

选择文件名案例(#channel.html,#Channel.html或#CHANNEL.HTML)并分别在filename_here上使用string tolowerstring totitlestring toupper。然后将该值用于所有文件操作。

答案 2 :(得分:0)

全局上的 lsearch 过滤器可用于对特定文件名执行不区分大小写的搜索,例如

% lsearch -nocase -all -inline -glob [glob ./*] {*/myfile.txt}
./myFile.txt ./Myfile.txt ./MYFILE.txt

在上面的lsearch结果中使用 llength 进行的健全性检查可用于在返回多个文件名的情况下标记错误。