Server.MapPath とスペース
-
11-12-2019 - |
質問
Server.MapPath() で奇妙なことに気づきました。末尾にスペースがあるフォルダーがある場合、次のようになります。
HTTP例外:パスのマッピングに失敗しました。
これはうまくいきます: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")
他の場所のスペースでは失敗しないのに、最後のスペースでは失敗する理由を誰かが説明してもらえますか?
注記: どのフォルダーも存在しません。
解決
なぜならあなたは すべきではありません:
ファイル名またはディレクトリ名の末尾をスペースやピリオドにしないでください。基礎となるファイル システムではそのような名前がサポートされている場合がありますが、Windows シェルとユーザー インターフェイスではサポートされていません。ただし、名前の最初の文字としてピリオドを指定することは可能です。たとえば、「.temp」などです。
問題はメソッドから来ています FileUtil.IsSuspiciousPhysicalPath(string physicalPath, out bool pathTooLong)
, 、比較を行います。
string.Compare(physicalPath, Path.GetFullPath(physicalPath), StringComparison.OrdinalIgnoreCase) != 0;
Path.GetFullPath()
ディレクトリ名とファイル名から末尾のスペースを削除します (呼び出しているため) Path.NormalizePath()
そうします)、呼び出して発見できます Path.GetFullPath(@"C:\Foo \Bar.txt")
例えば。これはスペースを含む元のパスと一致しないため、メソッドは次の値を返します。 true
したがって、パスが疑わしいものとして識別され、その後、 Server.MapPath
例外がスローされます。
他のヒント
MAPPATHメソッドは、指定された相対パスまたは仮想パスをサーバー上の対応する物理ディレクトリにマッピングします。メソッドは、返すパスが有効か、サーバー上に存在するかどうかを確認しません。Directory.exists()またはfile.exists()メソッドを使用して、ディレクトリまたはファイルが既に存在するかどうかを確認する必要があります。
if (File.Exists(Server.MapPath(file))
.
さらに、以下の方法のためのInvlid文字も知られています。
アスタリスク(*)
疑問符(?)
山括弧(<または>)
カンマ(、)
コロンまたはセミコロン(または;)
シングルクォートまたはダブルクォート( 'または ")
右角ブラケット(])
ダブルスラッシュ(//または\)
助けを願っています。
編集
Thing Postを使用して、.NET FramWorkコードをデバッグした後にメソッドserver.MapPath
を使用しているときに実際に探しているものを見つけようとしました。
ファイル - System \ Web \ HttpServerUtility.cs \ 1477467 \ httpServerUtility.cs. 方法 -mappath
ファイル - \ system \ web \ virtualpath.cs \ 1477467 \ virtualpath.cs * メソッド * - create
ファイルシステム\ web \ httprequest.cs \ 1599819 \ httprequest.cs 方法 -mappath
しかし、私は、パスが/ folder1 / folder2 /file.csの場合はNULLを返しますが、Enter / folder1 / folder2 / file.cs の場合はREUTN NULLオブジェクトではありません。
私はあなたがFramWorkに踏み入れたいのが好きで、何が達しているのか見て
良い質問..まだこの質問に対するアンウェーターは、そのファイルをFramewok にデザインするマイクロソフトの人々によって与えられるかもしれません。
問題は、スペースi.e "folder2"のフォルダを見つけることができません。有効で、このフォルダをファイルシステム上のこのフォルダを見つけることができません。
基本的には、最後にNAMEI.Eの後にSAPCEを搭載しているWindowsファイルシステム上のフォルダが見つかりません。