Visual Studio 2010
を使用してWebサイトを開発しています。ファイルをパスに保存しようとしています。それはうまくローカルホストで動作します。
ただし、IISでは同じコードは機能しません。次のエラーが表示されます
例外の詳細:System.IO.DirectoryNotFoundException:パス 'C:\ Inetpub\wwwroot\Vendor\cn.jpg'の一部が見つかりませんでした。
パス「C:\ Users\shashank\Desktop\ab.csv」の一部が見つかりませんでした。
コードは次のとおりです。
protected void btnImportFile_Click(object sender, EventArgs e)
{
sArReportText = File.ReadAllText(txtFilePath.Text.Trim());
// Set the report Properties to insert Report information
SetProperties();
}
また、ディレクトリ名に通常とは異なる文字が含まれているということもあります。私の場合、
Could not find a part of the path 'C:\Web\metBoot\wild iis\DigiCert© Certificate Utility for Windows_files'.
その著作権標識が問題です。
長いファイル名から短い8.3ファイル名を取得する の概念を使用して、最初にパスを短い形式に変換し、それを使用してファイルのリストを取得します。
StringBuilder sf = new StringBuilder(300);
int n = GetShortPathName(sourceFolder, sf, 300);
if (0 == n)
{
tk.write(Marshal.GetLastWin32Error().ToString());
continue;
}
...
IEnumerable<string> fileGroup = Directory.EnumerateFiles(sf.ToString(), ext);
VSの起動方法も検討してください。直感に反して、VSを管理者モードで実行している場合にのみ、この問題が発生します。おそらくグループポリシーのことです。
これは、指定されたファイルがWebサーバーにないか、誤ったパスが使用されている可能性があるためです。 Webサーバーでの保存方法として、正確なフォルダーとファイル名を指定します。使用する HttpContext.Current.Request.ApplicationPath
またはServer.MapPath
を使用して、目的のファイルがある正しい場所を指定します。また、この特定のファイルとそのフォルダーに対して読み取りおよび書き込み権限を付与していることを確認してください。
サーバー上のファイルにアクセス、作成、削除するには、権限が必要です。私のプロジェクトのように、Impersonatorクラスを使用して、サーバーからさまざまなファイルとフォルダーにアクセスしています。それ以外の場合は、例外がスローされます。
ファイルをフォルダーに保存できるようにするには、iisでアクセス許可を設定する必要があります。基本的に、アップロードしたファイルは、ルートディレクトリ内の別のフォルダーに保存する必要があります。
コードの偽装を使用できます:
http://csharptuning.blogspot.com/2007/06/impersonation-in-c.htmlhttp://www.codeproject.com/Articles/14358/User-Impersonation- in-NET
ただし、なりすましとして使用するユーザーは、保存先の場所に対して読み取り/書き込みができる必要があります。このメソッドは、ネットワーク全体でフォルダーを削除/作成するアプリケーションで使用します。 App_Dataがベストプラクティスである場合でも、そのフォルダー外のドキュメントにアクセスすることがビジネス要件になる場合があります。
IISで偽装を設定することもできます。
また、あなたの関数はbtnImportFileと呼ばれています。ファイルをアップロードする場合は、FileUploadコントロールを調べてください。ファイルのバイト配列を取得し、必要に応じて保存できます。 https://msdn.Microsoft.com/en-us/library/system.web.ui.webcontrols.fileupload%28v=vs.110%29.aspx それでも、必要に応じてServer.MapPathまたはHttpContext.Current.Request.ApplicationPathを使用する必要がある場合があります。