0

Win32 システムで奇妙な動作が発生しました。パスC:/temp/file.txt._wfindfirstandに渡すと、ディスク上に_wfopen_sしかC:/temp/file.txt存在しないファイルが正常に開かれます。

.最初に、 Win32 ではワイルドカード文字として受け入れられる可能性もあると思いましたが、Microsoft のドキュメントを見て

.これらはキャラクターについてまったく言及していません。

もちろん、_wfopen_sまたはに入れる前にパスを確認することはでき_wfindfirstましたが、違法なパスでファイルを開くのを防ぐ他の手段があるかどうか疑問に思っています...

4

2 に答える 2

1

ワイルドカードではありません。ファイル名の末尾のドットは常に省略されるためF.、 とFはすべてのF.

于 2012-05-16T13:20:18.357 に答える
1

'.'NTFS 自体はファイル名の末尾のピリオドをサポートしていますが (古い POSIX サブシステムのような特定のクライアントはそのようなファイルを使用できます)、Win32 API 自体はファイルを開くときに末尾を削除しません:

CreateFile() は、ファイル名とディレクトリ名から末尾のスペースとピリオドを削除します。これは、FAT および HPFS ファイル システムとの互換性のために行われます。

どうやら、FindFirstFile()友人も同じことをしています (上記を考えるとそれほど驚くことではありませんが、そう言っている明示的なドキュメントは見つかりません)。

入力ファイル名を直接チェックして、制限されたファイル名の 1 つと一致するかどうかを確認する代わりに、によって返される構造体のnameフィールドをチェックして、一致するかどうかを確認できます(および で見つかったすべてのファイルに対して同じことを行います)。しかし、ここはあなたが向かっていた場所だったと思います。_wfinddata_t_wfindfirst()_wfindnext()

8.3 形式のファイル名を渡すと、フィールドにかなり異なるファイル名が返される可能性があることに注意してくださいname(OS が長いファイル名を短いファイル名にマッピングするため)。チェックでそのマッピングを考慮する必要がある場合があります.Win32 FindFirstFile()/ FindNextFile()APIは、一致する長いファイル名と対応する短いファイル名の両方を返すため、それを支援する可能性があります.

FindFirstFileW()代わりに直接使用すると_wfindfirst()、および cAlternatefileName` フィールドをチェックしてcFileName、実際に見つかったファイルを確認できます

于 2012-05-17T07:53:39.973 に答える