【问题标题】:Working with Unicode file names in VBA (using Dir, FileSystemObject, etc.)在 VBA 中使用 Unicode 文件名(使用 Dir、FileSystemObject 等)
【发布时间】:2016-02-14 15:15:57
【问题描述】:

我正在迭代文件夹中的文件(这意味着我不知道文件夹中的名称),并且有一个带有波兰语ł 字符的文件。

Dir 函数将其转换为l,这意味着以后无法找到该文件名。我已将分配 dir 值的 var 声明为字符串。

我也试过 FSO 和 getfolder 也有同样的问题。

我还注意到文件对话框(设置为文件夹选择模式)也转换了上面的字符。


这是一个错误,还是可以解决的问题?

【问题讨论】:

  • 我的错,我确实很匆忙地做了这件事,但并不是要指出它是重复的,而是要指出一个可能的工作角度,但仔细看看它不适用于您的问题。让我仔细看看。你可以发布你的代码吗?或者你是如何Dim 使用Dir 的变量?你也试过Files Scripting Object吗?
  • 这个链接vbforums.com/… 看起来很有趣,但它是VB 而不仅仅是VBA。还有一种方法可以在之后转换特殊字符,但它仅适用于您已对其进行转码的字符。无论如何,FSO(文件脚本对象)似乎没有与Dir 相同的限制,所以如果在您的代码中实现不是很复杂,我个人会这样做!
  • 该死... FSO 也有同样的问题... 您是否尝试将您的 Dir 值声明为 Variant? (疯狂的猜测,但在这一点上,似乎(至少在我看来)只剩下 VB 或转码......)。以下是 transco/convert 的链接:pcreview.co.uk/threads/…vbforums.com/…
  • 最好不要在文件名中使用非标准字符。三个选项 - 修复文件名或使用 Dir 的功能加载部分文件名使用 * 字符或使用 AppLocale Utility
  • @Meehow 使用 * 没有任何帮助。字符的转换是文件无法打开的问题。而且,[a-z0-9_]+ 文件名很久以前就消失了,尤其是对于非英语用户。

标签: vba ms-access unicode ms-access-2013 dir


【解决方案1】:

您似乎被以下事实误导了:VBA 本身 支持 Unicode 字符,而 VBA 开发环境 不支持。 VBA 编辑器仍然使用基于 Windows 中区域设置的旧“代码页”字符编码。

当然FileSystemObject 等。 al. 实际上支持文件名中的 Unicode 字符,如下例所示。一个包含三个纯文本文件的文件夹

文件名:1_English.txt
内容:London is a city in England.

文件名:2_French.txt
内容:Paris is a city in France.

文件名:3_Połish.txt
内容:Warsaw is a city in Poland.

以下 VBA 代码...

Option Compare Database
Option Explicit

Sub scanFiles()
    Dim fso As New FileSystemObject, fldr As Folder, f As File
    Set fldr = fso.GetFolder("C:\__tmp\so33685990\files")
    For Each f In fldr.Files
        Debug.Print f.Path
    Next
    Set f = Nothing
    Set fldr = Nothing
    Set fso = Nothing
End Sub

...在立即窗口中产生以下输出...

C:\__tmp\so33685990\files\1_English.txt
C:\__tmp\so33685990\files\2_French.txt
C:\__tmp\so33685990\files\3_Polish.txt

注意Debug.Print 语句将ł 字符转换为l,因为VBA 开发环境无法使用我的Windows 语言环境(美国英语)显示ł

但是,以下代码确实成功打开了所有三个文件...

Option Compare Database
Option Explicit

Sub scanFiles()
    Dim fso As New FileSystemObject, fldr As Folder, f As File, ts As TextStream
    Set fldr = fso.GetFolder("C:\__tmp\so33685990\files")
    For Each f In fldr.Files
        Set ts = fso.OpenTextFile(f.Path)
        Debug.Print ts.ReadAll
        ts.Close
        Set ts = Nothing
    Next
    Set f = Nothing
    Set fldr = Nothing
    Set fso = Nothing
End Sub

...显示

London is a city in England.
Paris is a city in France.
Warsaw is a city in Poland.

【讨论】:

  • @user3791372 - 当我在循环中Debug.Print f.Size 时,我得到正确的(非零)值。我不确定你所说的“LOF”是什么意思,所以也许你正在做一些完全不同的事情。
  • @user3791372 - f.Size 是否为所有文件返回零,还是只为名称中包含“有趣字符”的文件返回零?
  • 可能是隐藏文件?
猜你喜欢
  • 2016-11-16
  • 2016-06-12
  • 2013-10-29
  • 2011-03-15
  • 2015-10-12
  • 2010-11-27
  • 2022-12-19
相关资源
最近更新 更多