6

グーグル教授からは情報が見つからなかったので、ここにいます。指定されたパス名を取得して、Windowsエクスプローラーに貼り付けます。余分な「。」でパスを生成するコードのバグを発見した後、私はこれに遭遇しました。ディレクトリ区切り文字の前のパス名で\...

@"C:\\pathto.\file.ext"

コードでは、.NETは呼び出し時にパスを受け入れ、File.Createファイルが生成されますが、このパスでは次のようになります。

@"C:\\pathto\file.ext"

C:\\pathto.\file.extWindowsエクスプローラーのアドレスバーにコピーして、「。」を監視します。消えてあなたを連れて行くC:\\pathto\file.ext

.NETおよびWindowsの正常な動作ですか?「。」が原因で問題が発生することはありません。ファイル操作に渡されると、.NETとWindowsの両方によって削除されます。実際の問題は、DB内のすべてのファイルに「。\」が付いたファイル名がありますが、「。\」がないパスに存在し、パスFile.Exists()が「実際の」物理ではない場合でも機能することです。位置...

何が起きてる?

4

2 に答える 2

4

これは、Windowsファイルシステムの「機能」です。MSDN

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

于 2013-03-26T16:36:47.277 に答える
0

通常のすべてのWindowsAPIは、通常のパスが渡されるときに、ファイル/フォルダー名の末尾のドットを無視/削除します。

末尾のドットのサポートが本当に必要な場合は、"\\?\"プレフィックス付きのパスを使用し、すべての呼び出しを自分で相互運用する必要があります(.Netはこのファイル形式をサポートしていないため)。MSDN:ファイル、パス、および名前空間の 命名、名前がドット( "。")で終わっているフォルダーを削除する方法を参照してください。詳細については、NTFSファイルシステムボリューム上のファイルまたはフォルダを削除することはできません。

長いファイルパスを受け入れる関数をPInvokeする方法を示す関連する質問は次のとおりです。c#長いファイルパスに対してWin32 APIを呼び出しますか?

于 2013-03-26T16:37:06.250 に答える