5

Server.MapPath() で奇妙なことに気付きました。最後にスペースがあるフォルダーがある場合、次のようになります。

HttpException: パスのマッピングに失敗しました。

これはうまくいきます: Server.MapPath("/Folder1/Folder2/item.jpg")

これはうまくいきます: Server.MapPath("/Folder1/ Folder2/item.jpg")

これはうまくいきます: Server.MapPath("/Folder1/Fol der2/item.jpg")

これは失敗します!: Server.MapPath("/Folder1/Folder2 /item.jpg")

最後のスペースが失敗し、他の場所のスペースが失敗しない理由を誰かに説明してもらえますか?

注:どのフォルダーも存在しません。

4

3 に答える 3

2

MapPathメソッドは、指定された相対パスまたは仮想パスをサーバー上の対応する物理ディレクトリにマップします。このメソッドは、返すパスが有効であるか、サーバー上に存在するかをチェックしません。Directory.Exists()またはFile.Exists()メソッドを使用して、ディレクトリまたはファイルがすでに存在するかどうかを確認する必要があります。

if (File.Exists(Server.MapPath(file)) 

さらに、メソッドのinvlid文字は次のとおりです。

アスタリスク(*)
疑問符(?)
山括弧(<または>)
コンマ(、)
コロンまたはセミコロン(:または;)
一重引用符または二重引用符('または")右角括弧
(])
二重スラッシュ(// また \)

お役に立てば幸いです。

于 2012-07-26T08:38:30.090 に答える
2

あなたがすべきではないので

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

この問題はFileUtil.IsSuspiciousPhysicalPath(string physicalPath, out bool pathTooLong)、比較を行う method から発生します。

string.Compare(physicalPath, Path.GetFullPath(physicalPath), StringComparison.OrdinalIgnoreCase) != 0;

Path.GetFullPath()ディレクトリ名とファイル名から末尾のスペースを削除します (これを呼び出すPath.NormalizePath()ため) Path.GetFullPath(@"C:\Foo \Bar.txt")。これはスペースを含む元のパスと一致しないため、メソッドは返さtrueれ、そのパスが疑わしいものとして識別された後Server.MapPath、例外がスローされます。

于 2012-07-26T13:33:19.037 に答える
1

編集

Microsoft .NET ソース コードにステップ インするための Visual Studio 2010 のセットアップ

モノの投稿を使用して、.netフレームワークコードをデバッグした後にメソッドを使用すると、.netフレームワークで実際に何が問題になっているのかを調べようとしserver.MapPathましたが、仮想パスから絶対パスを取得する呼び出しが次のファイルとフレームワークのメソッドをスローすることがわかりました

ファイル- System\Web\httpserverutility.cs\1477467\httpserverutility.cs メソッド-MapPath

ファイル- \System\Web\VirtualPath.cs\1477467\VirtualPath.cs*メソッド*-Create

ファイル-System\Web\HttpRequest.cs\1599819\HttpRequest.cs メソッド-MapPath

しかし、パスが /folder1/folder2 /file.cs の場合、ストレージの動作で null が返されるが、/folder1/ folder2/file.cs に入ると null オブジェクトが返されないことがわかりました。

フレームワークに足を踏み入れて、何が起こるか見てみたいと思います

とにかく良い質問..しかし、この質問に対する回答は、フレームワークでそのファイルを設計するマイクロソフトの人々によってのみ与えられる可能性があります


問題は、スペースのあるフォルダ、つまり「Folder2」を見つけることができないことです。有効ではなく、ファイル システムでこのフォルダを見つけることができません。

基本的に、最後または最初に namei.e の後に sapce がある Windows ファイル システム上のフォルダーは見つかりません。

于 2012-07-26T08:23:47.510 に答える