我根据使用Dir的条件选择文件列表,然后将它们存储在字符串数组中。然后我遍历数组并处理文件。
如何使用unicode字符处理文件名?
我尝试StrConv
,但没有帮助。
vfile = Dir(vCurrDir & vCrit, vbNormal) 'vCrit is something like *test*
然后我会尝试访问文件的属性,如下所示:
vfilename = vCurrDir & "\" & vfile
Set objFSO = CreateObject("Scripting.FileSystemObject")
vDateMod = objFSO.GetFile(vfilename).datelastmodified
在最后一行,我收到一条错误消息,指出找不到该文件。这仅适用于具有unicode字符的文件名。
此处有另外一篇文章:Working with Unicode file names in VBA (using Dir, FileSystemObject, etc.),但它没有t solve the problem with
Dir`。
我的例子: VBA(watch)c:\ my-test-file.pdf Unicode:c:\ my-test-file.pdf
(你不能在这里看到区别,但是如果你复制这些名字并将它们粘贴到Notepad ++中,你会发现这两个文件的破折号是不同的字符,VBA正在将unicode破折号字符转换为windows locale破折号)< / p>
或链接问题的示例: 3_Połish.txt(在Unicode中)与3_Polish.txt(在VBA中)
答案 0 :(得分:0)
实际上,问题在于使用Dir
创建文件列表,我建议更广泛地使用FileSystemObject
,即:Folder
的属性和File
个对象。
以下过程为文件夹Name
中的所有DateLastModified
文件打印属性Path
,txt
和D:\@D_Trash\
Sub Files_with_Unicode_Chars()
Dim oFso As Object 'Scripting.FileSystemObject
Dim oFdr As Object 'Scripting.Folder
Dim oFle As Object 'Scripting.File
Dim vCurrDir As String, vCrit As String
Set oFso = CreateObject("Scripting.FileSystemObject")
vCurrDir = "D:\@D_Trash\" 'Update as needed!
vCrit = ".txt" 'Update as needed!
Set oFdr = oFso.GetFolder(vCurrDir)
For Each oFle In oFdr.Files
With oFle
Select Case Mid(.Name, InStrRev(.Name, "."))
Case vCrit
Rem Perform actions as needed
Rem This sample shows the use some of the File object properties
Debug.Print Now; vbTab; "["; .Name; "]"; Tab(71); .DateLastModified; Tab(101); .Path
End Select: End With: Next
End Sub
答案 1 :(得分:0)
我有一个类似的问题。使用FileSystemObject爬行文件的子目录太慢了。出于我的需要,我编写了批处理文件的创建和运行代码,其中除其他外,还使用了Dir
命令并将输出通过管道传输到文件中。然后,在批处理文件完成之后,我的代码解析了输出文件。奇怪的是,unicode字符就很好了,然后突然就不行了。 (我从来没有试图弄清楚原因。我猜想是因为我们将文件移到了其他位置,我开始使用客户端而不是服务器来进行处理,或者是因为Win10升级,但没有一个原因这些都在我的控制范围内。)
我解决问题的方法是将批处理文件的创建方式从包含dir
命令更改为改为执行call cmd /u /c dir "dirpath" > c:\Temp\DirOutput.txt
的DOS命令,然后读取文件。
cmd /u
是关键部分。这将强制通过管道传递到文件的输出采用Unicode call
,因为它位于批处理文件中,并且call
暂停批处理文件执行,直到命令完成。简单的dir
不需要,但是我发现cmd
需要它。 (也许有更好的方法,但这是我第一次偶然发现的方法。)/c
的{{1}}标志告诉cmd
将行的其余部分视为要执行的命令,然后终止。cmd
也可以具有标志。我使用了dir
标志,因为我需要及以下 /s
dirpath
告诉>
将结果输出到文本文件。答案 2 :(得分:-1)
尝试使用BuildPath https://msdn.microsoft.com/en-us/library/office/gg251615.aspx代替
vfilename = vCurrDir & "\" & vfile