1

このエラーが発生します

The process cannot access the file '..\Images\Temp\6574_1212665562989_1419270107_30610848_6661938_n.jpg' because it is being used by another process.

私がこれを試したとき:

try
{
    var file = Request.Files["FileProfilePicture"];
    file.SaveAs(Server.MapPath("~/Images/Temp/" + file.FileName));
    Bitmap imageOrj = new Bitmap(System.Web.HttpContext.Current.Server.MapPath("~/Images/Temp/" + file.FileName));
    Image imageBig = ResizeImage.Resize(imageOrj, 100, 100);
    imageBig.Save(System.Web.HttpContext.Current.Server.MapPath("~/Images/ProfilePicBig/" + file.FileName));
    Image imageSmall = ResizeImage.Resize(imageOrj, 50, 50);
    imageSmall.Save(System.Web.HttpContext.Current.Server.MapPath("~/Images/ProfilePicSmall/" + file.FileName));

    string[] files = System.IO.Directory.GetFiles(Server.MapPath("~/Images/Temp/"));
    foreach (string pathFile in files)
    {
        System.IO.File.Delete(pathFile);
    }


    return RedirectToAction("Index", "Author");
}
catch (Exception e)
{
    ModelState.AddModelError("", "Kullanıcı bilgileri güncellenirken bir hata oluştu. Lütfen daha sonra tekrar deneyin." + e.Message);
}

どうすれば修正できますか。または、画像を一時的に保持するための別のより良い方法。ファイルを一時フォルダに保存する必要がありますか?

ありがとう

4

3 に答える 3

1

一時的にファイルを別の場所で開いていないことを確認しましたか?

このエラーは、前回の実行でエラーが発生し、ファイルが閉じられていない場合にも発生します。この場合、別のファイル名を試すか、OS側から閉じられていないファイルを削除することができます。

これがお役に立てば幸いです...

それ以外の場合、私は通常、一時ファイルを実行するのと同様の方法を使用します...

編集:コメントによると、上記の問題の解決策は次のようです。try-catchブロックで処理される場合は常に、catchノードで処理されない場合、ファイルオブジェクトが閉じられない可能性があります。この特定のケースでは、imageOrjオブジェクトが問題を引き起こしたためimageOrj.Dispose()、ビットマップの編集が終了した後にを使用することをお勧めします。

于 2012-04-24T12:28:34.830 に答える
1

一時ファイルを保存する必要はありません。メモリ内にビットマップを作成し、リクエスト ストリームを設定できます。ディスクに保存する必要はありません。

于 2012-04-24T12:22:30.797 に答える
-1

削除ループで作成したよりも多くのファイルを削除しているようです。~/Images/Temp/ の下にあるすべてのファイルを削除しようとしています。これにより競合が発生する可能性があります (つまり、異なるリクエスト間のデータ競合)。作成したファイルのみを削除します。

于 2012-04-24T12:55:53.660 に答える