我将参数值传递 '*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;
Run Code Online (Sandbox Code Playgroud)
and*_*ius 25
原因是该文件具有"长"名称,即超过8个字符.对于此类文件,Windows还会创建"短"名称,通常在表单中创建,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 :
搜索包括长文件名和短文件名.
要解决此问题,那么,而不是使用Delphi的包装器FindFirstFile(),调用Win32 API FindFirstFileEx().传递FindExInfoBasic给fInfoLevelId参数.