7

どういうわけか、ファイルが私のディレクトリの1つに表示され、拡張子の最後にスペースがあります。その名前は「test.txt」です。奇妙なことに、このファイルのパスが返されますが、クラスDirectory.GetFiles()でファイル情報を取得できません。FileInfo

エラーはここに現れます:

DirectoryInfo di = new DirectoryInfo("c:\\somedir");
FileInfo fi = di.GetFileSystemInfos("test*")[0] as FileInfo; 
//correctly fi.FullName is "c:\somedir\test.txt "
//but fi.Exists==false (!)

FileInfoクラスは壊れていますか?どういうわけかこのファイルに関する情報を取得できますか?そのファイルが私のファイルシステムにどのように表示されたかは本当にわかりません。また、それらのいくつかを再作成することはできません。

このタイプの拡張子を持つ新しいファイルを作成する試みはすべて失敗しましたが、プログラムを実行するとクラッシュします。ファイルを見つけるときに例外を簡単に処理できますが、これについては気になります。

4

3 に答える 3

6

スペースで終わるファイル名は、悪い考えとして文書化されています。

MSDN 「ファイル、パス、および名前空間の命名(Windows)」から

  • ファイル名またはディレクトリ名をスペースまたはピリオドで終了しないでください。基盤となるファイルシステムはそのような名前をサポートしている場合がありますが、Windowsシェルとユーザーインターフェイスはサポートしていません。

また、KB記事「INFO:スペースまたはピリオドで終わるファイル名はサポートされていません」

MacintoshクライアントがWindowsNTサーバー上にファイルを作成すると、問題が発生する可能性があります。末尾のスペースとピリオドを削除するコードは実行されず、Macintoshユーザーは正しく句読されたファイル名を取得します。Win32 APIは、スペースまたはピリオドで終わるファイル名を返しますFindFirstFile()FindNextFile()ただし、Win32APIを使用してファイルを作成または開く方法はありません。

DirectoryInfoおそらくFindFirstFile()、ディレクトリリストを作成するためにandfriendsを使用します。File.Exists実装されている可能性が高くGetFileAttributes()、おそらく同じ問題が発生しCreateFile()、存在しないファイルが報告されます。

したがって、特に.NETでは問題ではなく、Windows自体で問題が発生します。

于 2010-04-30T07:12:49.683 に答える
4

はい、私はこれらのファイルを知っています。私も一度そのような獣のものを手に入れました。それを取り除くために、私はC#でのプログラミング方法について知りませんが、古き良きコマンドラインはあなたの友達です:

指定されたフォルダでコンソールウィンドウを開きます(またはcmdを実行し、コマンドを使用してフォルダに移動しますcd)。次に、Enterdir /xキーを押して、このディレクトリ内のファイルの短縮名を取得します。delこの名前を使用して、またはrenコマンドを使用してファイルを削除または名前変更します。

于 2010-04-30T07:15:31.213 に答える
0

\\?\パス構文を使用すると、(他のエッジケースの中でも)末尾にスペースがあるファイルを操作できます\\?\c:\somedir\test.txt

于 2021-02-15T00:29:48.553 に答える