我将参数值’* 1.dat’传递给FindFirst,仍然是FindFirst()例程返回的第一个文件是46checks5.dat,非常一致.
这是一个已知的问题吗?
vpath:=trim(vpath); result:=true; try res:=findfirst(vpath+'\'+vmask,faarchive,search); //vmask = *1.dat try while res=0 do begin vlist.add(search.name); //searchname returned is 46checks5.dat!!! res:=findnext(search); end; finally findclose(search); end; except result:=false; end;
解决方法
原因是该文件具有“长”名称,即超过8个字符.对于这样的文件,Windows还会创建“short”名称,通常是以longna〜1.dat格式创建的,而这个简短名称是通过* 1.dat通配符找到的.
您可以在空目录中的命令提示符中轻松重现相同的行为:
C:\TEMP>echo. > 46checks5.dat C:\TEMP>dir /x *1.dat Volume in drive C has no label. Volume Serial Number is 5C09-D9DE Directory of C:\TEMP 2011.04.15 21:37 3 46CHEC~1.DAT 46checks5.dat 1 File(s) 3 bytes
FindFirstFile()
的文档,它是FindFirst的底层API:
The search includes the long and short
file names.
为了解决这个问题,那么,而不是使用Delphi的包装器来FindFirstFile(),调用Win32 API FindFirstFileEx()
.将FindExInfoBasic
传递给fInfoLevelId参数.