我必须修复遗留在遗留代码中的错误。此代码调用FtpFindFirstFileW来收集有关FTP服务器上文件的信息。然后使用InternetFindNextFile迭代文件,将信息放入向量并返回此向量。
然而,问题是传递给FtpFindFirstFileW的“路径”也可能是单个文件的路径。 FtpFindFirstFileW可以正常返回有关此单个文件的信息。但之后我认为没有可能可靠地获得文件的完整路径(即首先传递给FtpFindFirstFileW的路径)。 WIN32_FIND_DATA structure仅包含没有路径的文件名。
可以使用类似
的路径调用我的方法如果可能的话,我想改变这种方法,以降低破坏遗留代码的风险。
WIN32_FIND_DATA FileData;
FtpFindFirstFile(hFTP, Path.c_str(), &FileData, 0, 0);
do
{
auto PathToFile = Path + FileData.cFileName; // wrong result if Path is full path to file (e.g. Path = path/to/file.txt and FileData.cFileName = file.txt)
auto PathToFile = Path; // wrong result if Path is path to directory (e.g. Path = path/ and FileData.cFileName = file.txt)
auto PathToFile = FileData.cFileName; // wrong result if Path path to directory (e.g. Path = path/ and FileData.cFileName = file.txt)
} while(InternetFindNextFile(Hdl,&FileData));
我没有看到方法来检查路径是目录/文件还是获取Windows-FTP-API中文件的完整路径。
修改
关于建议使用FileData.dwFileAttributes区分文件和目录的注释:
如果我使用路径/foo/bar
调用FtpFindFirstFile,我可能会使用FileData.cFilename = bar
获得单个结果。如果FileData.dwFileAttributes
未设置FILE_ATTRIBUTE_DIRECTORY
位,我看不出有办法知道这是因为/file/bar
是一个文件还是因为/file/bar
是一个目录而且文件/foo/bar/bar
。