1

ディレクトリ内のファイルを一覧表示する方法については、MSDN のこのガイドに従っています (現在のディレクトリを使用しています)。私の場合、パケットのメッセージ部分 (サイズ 1016 の char 配列) に情報を入れて、クライアントに送信する必要があります。クライアントとサーバーの両方で 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));
4

3 に答える 3

5

これは一般に、ワイド文字列が誤って ASCII 文字列として扱われることが原因です。ビルドは UNICODE を対象としcFileNameており、ワイド文字列が含まれていますsprintf()が、ASCII 文字列であると想定しています。

FindFirstFile()ビルドが UNICODE をターゲットにしているかどうかに応じて、FindFirstFileA()またはのいずれかにマップされます。FindFirstFileW()

FindFirstFileA()解決策は、ASCII 文字列を明示的に使用することです。

&ではは不要であることに注意してくださいsprintf()

sprintf(packet.message, "%s", f.cFileName);

アプリケーションは制御できない文字列 (ファイル名など) を消費している_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)
{
}
于 2012-11-19T09:05:04.593 に答える
4

FindFirstFile の Unicode バージョンを使用していることはほぼ確実です。狭いバージョンを呼び出すか、印刷の書式指定子を変更してください。個人的には前者を行います:

WIN32_FIND_DATAA f;
HANDLE h = FindFirstFileA("./*.*", &f);
string file;
int size_needed;
do
{
    sprintf(packet.message,"%s", f.cFileName);
    //Send packet
} while(FindNextFileA(h, &f));
FindClose(h);

または、MBCS または通常の文字を使用してコンパイルすることもできます。

于 2012-11-19T09:04:00.170 に答える
2

他の人が述べているように、あなたはUnicodeバージョンを呼び出しており、 UnicodeデータをAnsi関数FindFirstFile()に渡しています。指定者はAnsi入力を期待していますsprintf()%sコードの問題に対処するには、いくつかの選択肢があります。

  1. を引き続き使用しますが、指定子をにsprintf()変更して、Unicode入力を受け入れ、メッセージバッファーに書き込むときにAnsiに変換します。%s%ls

    sprintf(packet.message, "%ls", f.cFileName);
    

    ただし、これはローカルマシンのAnsiエンコーディングを使用するため、理想的ではありません。これは、受信マシンで使用されるAnsiエンコーディングとは異なる場合があります。

  2. TCHARの代わりに使用するようにメッセージバッファを変更してから、またはの代わりにchar切り替えます。のように、それらはどの文字形式とも一致し、以下を使用します。wsprintf()_stprintf()sprintf()FindFirstFile()TCHARTEXT()

    TCHAR message[1016];
    wsprintf(packet.message, TEXT("%s"), f.cFileName);
    

    または:

    #include <tchar.h>
    
    _TCHAR message[1016];
    _stprintf(packet.message, _T("%s"), f.cFileName);
    
  3. バッファを使用する必要がある場合はchar、APIからUnicodeデータを受け入れ、送信のためにUTF-8に変換する必要があります。そうすれば、受信者はそれをUnicodeに変換し直して、必要に応じて使用できます。

    WIN32_FIND_DATAW f;
    HANDLE h = FindFirstFileW(L"./*.*", &f);
    if (h)
    {
        do
        {
            WideCharToMultiByte(CP_UTF8, 0, f.cFileName, lstrlenW(f.cFileName), packet.message, sizeof(packet.message), NULL, NULL);
           //Send packet
        } while(FindNextFile(h, &f));
        FindClose(h);
    }
    
于 2012-11-19T19:44:11.280 に答える