1

次のコードサンプルについて:

string baseLocation = HttpContext.Current.Server.MapPath("/");
const string templateName = @"//temp//ExportTemplate.xlsx";
const string generatedLocation = @"{0}//temp//{1}";
var fileName = string.Format("Export-{0}.xlsx", DateTime.Now.Date.ToString("yyyy-MM-dd"));
var newFile = String.Format(generatedLocation, baseLocation, fileName);
File.Copy(baseLocation + templateName, newFile, true);

これは、運用サーバーとローカル開発環境(IISのサイト経由)で使用しています。どちらもIIS7.5を実行しています。コードは本番環境では正しく機能しますが、ローカル開発でエラーが発生します。

Access to the path 'C:\Path\To\Site\//temp//Export-2013-01-29.xlsx' is denied.

ファイルはローカル開発で正しく作成/コピーされますが、パスのスラッシュが正しくないためにエラーが発生していると思います。アプリプールIDには、「temp」フォルダーへのフルアクセス権があります。

これにより、いくつかの質問が発生します。

  • この状況では、「//」はパスに対して何をしますか?「\」が円記号をエスケープする方法であることは理解していますが、「//」は意味がありません。
  • 生成されたパスを本番サーバーで正しく機能させるが、ローカル開発では失敗する2つの環境の構成に違いはありますか?
4

2 に答える 2

2

コードでは、ファイルパスに/ではなく\を使用する必要があります。また

const string templateName = @"\temp\ExportTemplate.xlsx";

また

const string templateName = "\\temp\\ExportTemplate.xlsx";

うまくいくでしょう。コードの現在のバージョンが本番環境で機能するのは驚くべきことです。これは、Windowsがファイルパスでスラッシュまたはバックスラッシュを使用できるように構築されていることが原因である可能性があります。(これは、ユーザーの多くがUNIXユーザーでもあったDOS時代にまでさかのぼります)

さらにPath.Combine、ファイルパスの文字列を単に連結するのではなく、使用することをお勧めします(これにより、「C:\ Path \ To \ Site \\ temp\Export-2013-」のようなパスで余分なスラッシュやスラッシュが取得されないようにすることができます。 01-29.xlsx ")。元:

File.Copy(Path.Combine(baseLocation, templateName), newFile, true);
于 2013-01-29T21:18:46.680 に答える
0

//常にあなたに//...文字列に@を付けると、それは逐語的な文字列リテラルであり、文字をエスケープする必要はありません。したがって、\を使用してを取得できます。@を削除する場合は、\を使用してを取得する必要があります。ファイルパスを操作しているときは、常にバックスラッシュ()です。URLパスを操作する場合、常にスラッシュ(/)です。

于 2013-01-29T19:54:10.630 に答える