文件名截断为仅显示第一个字符

Por*_*ker 1 c++ file-io winapi

我下面这个指南从MSDN上如何列出一个目录中的文件(我使用的是当前目录).在我的情况下,我需要将信息放在我的数据包的消息部分(大小为1016的字符数组)中,以将其发送到客户端.当我在客户端和服务器上打印packet.message时,只显示文件名的第一个字符.怎么了?以下是相关代码段的摘要:

WIN32_FIND_DATA f;
HANDLE h = FindFirstFile(TEXT("./*.*"), &f);
string file;
int size_needed;
do
{
    sprintf(packet.message,"%s", &f.cFileName);
    //Send packet
} while(FindNextFile(h, &f));
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 5

这通常是由于广泛的字符串被错误地视为ASCII字符串引起的.构建目标是UNICODE并cFileName包含一个宽字符串,但sprintf()假设它是一个ASCII字符串.

FindFirstFile()将映射到FindFirstFileA()或者FindFirstFileW()取决于构建是否针对UNICODE.

解决方案是FindFirstFileA()明确使用和ASCII字符串.

请注意,在以下&情况中不需要sprintf():

sprintf(packet.message, "%s", f.cFileName);
Run Code Online (Sandbox Code Playgroud)

由于应用程序正在使用超出其控制范围的字符串(即文件名),我建议使用更安全_snprintf()的避免缓冲区溢出:

/* From your comment on the question 'packet.message' is a 'char[1016]'
   so 'sizeof()' will function correctly. */
if (_snprintf(packet.message, sizeof(packet.message), "%s", f.cFileName) > 0)
{
}
Run Code Online (Sandbox Code Playgroud)