0

我在将文件从 Windows 计算机上传到 Unix 服务器的一个 Tcl 脚本中遇到了问题。我想从 Windows 文件中获取原始文件名并使用相同的名称保存新文件。问题是 [file tail windows_file_name] 不起作用,它返回整个文件名,如“c:\temp\dog.jpg”,而不仅仅是“dog.jpg”。文件尾部在 Unix 文件名“/usr/tmp/dog.jpg”上正常工作,因此由于某种原因它没有检测到文件是 Windows 格式。但是,我的 Windows 计算机上的 Tcl 对任何一种名称格式都可以正常工作。我使用的是 Tcl 8.4.18,所以它可能太旧了?还有其他技巧可以让它正确拆分吗?

谢谢

4

2 回答 2

1

这里的问题是,在 Windows 上,只要涉及 Windows API,两者\/都是有效的路径分隔符(即使仅\在 Windows 上被视为“官方”)。另一方面,在 POSIX 中,唯一有效的路径分隔符是/,并且唯一不能出现在路径名组件中的两个字节是/\0(值为 0 的字节)。

因此,在 POSIX 系统上,“C:\foo\bar.baz”是一个完全有效的文件名,并且正在运行

file normalize {C:\foo\bar.baz}

会产生/path/to/current/dir/C:\foo\bar.baz。同理,[file tail $short_filename]同理$short_filename

解决方案是要么按照 Glenn Jackman 的建议去做,要么通过其他方式从浏览器传递短名称(某些 JS 绑定到适当的文件条目?)。您也可以尝试从 User-Agent 标头中检测用户的操作系统。

为了让 Glenn 的想法对用户的平台更加不可知,你可以这样:

  1. 扫描文件名中的“/”。
    • 如果没有找到,请执行set fname [string map {\\ /} $fname]下一步。
  2. 用于[file tail $fn]提取尾部名称。

它不是很防弹,但据说总比没有好。

于 2012-05-04T20:25:57.503 回答
0

你总是可以做[lindex [split $windows_file_name \\] end]

于 2012-05-04T20:07:03.603 回答