FileSystemObject - 不支持的文件名字符

3

有没有一种函数可以将不良文件名转换为良好的文件名?

我正在处理大量照片,很少情况下,我的脚本会停止,因为上传者在文件名中放了一个卷曲符号(~)。我现在也想知道是否还有其他不能出现在文件名中的坏符号以及如何转义它们。

我正在使用VBScript的FileSystem对象循环遍历这些文件,类似于以下内容:

For Each File In Files
    If InStr(UCase(File.Name), ".JPG") > 0 Then
        '// do stuff
    End If
Next

2
我不确定你的错误是什么,但是~是Windows文件名中有效的字符。 - aphoria
你可能想要追究为什么会出现错误。由于最有可能的原始文件名来源也是来自某个基于Windows的操作系统中的文件,因此你很难收到无效字符的消息。正如aphoria所指出的那样,在Windows文件名中,~是完全合法的。在尝试“修复”之前,你应该努力找到错误的真正原因。 - AnthonyWJones
你的错误是什么?FileSystemObject 与缩短的 8.3 命名约定一起使用。 - Nilpo
@AnthonyWJones:抱歉,我的错,我在向SO提问之前应该进一步调查这个问题。我发现所涉及的文件已经损坏了。现在我知道它已经损坏了,我怀疑崩溃的不是文件系统对象,而更有可能是读取文件的ASP.JPEG组件出了问题。不过这个情况很奇怪,因为每个损坏的文件都以下划线开头并带有波浪线。因此,也许我可以编程让它寻找这种文件并将其从文件夹中删除。 - TheCarver
1个回答

6
您可以编写一个函数来返回“已清理”的文件名,例如:
function MakeNormal(filename)
    dim re : Set re = new regexp

    re.Pattern = "[^\w :\\\.]"
    re.Global = True

    MakeNormal = re.Replace(filename, "_")

end function

msgbox MakeNormal("C:\Temp\normal filename.txt")
msgbox MakeNormal("C:\Temp\special ~!@#$%^&*() filename.txt")

' returns: "C:\Temp\normal filename.txt" and "C:\Temp\special __________ filename.txt"

将文件名更改为已清理过的名称。当您有两个仅在特殊字符上唯一的文件时,这变得很危险。

以上是“白名单”版本,如果您喜欢“黑名单”版本,则可以将模式替换为[~!@#$%^&()]之类的内容。


我不同意。您正在删除允许出现在有效文件名中的字符。虽然这是有效的,但这是一个糟糕的解决方案。 - Nilpo
@Nilpo,你在学术上是正确的。但是根据我的经验,有时你会遇到不符合Windows文件名约定的系统,特别是在ASCII 127-255范围内。如果你有一个第三方上传程序不能使用某些符号,你就必须退而求其次,对输入进行清理。一种方法是用可接受的字符替换不良字符。 - AutomatedChaos
我从未见过FSO无法处理合法命名的文件的情况。想一想——那会使FSO变得非常无用。你甚至不能在尝试打开文件或其他任何操作之前重命名文件。这将引发一系列其他问题的连锁反应。 - Nilpo
@Nilpo 嗯,你应该试试Sharepoint。在Windows的文件名中, ~、#、%或&这些字符是允许的,但是不能上传带有这些字符的文件名。我花了一些时间才发现为什么我的截图没有自动保存到特定位置(如R:\ TestReports \ Screenshots \),而保存到任何其他位置(C:\ Temp \)都没问题。最后,我意识到R:驱动器实际上是从Sharepoint位置映射来的,而我的文件名中有一个#。 - AutomatedChaos
但问题不是关于Sharepoint,而是关于FSO。另外,Sharepoint专门设计用于Web使用。它保留了所有在URL中具有特殊含义的字符是有意义的。 - Nilpo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接