0

を使用してファイルをアップロードしていますHttpPostedFileBase。ファイルは問題なくアップロードされますが、そのファイル (Excel ファイル) から読み取ろうとすると、ファイルがロックされているため読み取ることができないというエラーが表示されます。ファイルからロックを解除するにはどうすればよいですか / そもそもファイルをロックしないようにするにはどうすればよいですか?

[HttpPost]
        public ActionResult Index(HttpPostedFileBase file)
        {
            string path = string.Empty;
            if (file.ContentLength > 0)
            {
                var fileName = Path.GetFileName(file.FileName);
                path = Path.Combine(Server.MapPath("~/App_Data/"), Guid.NewGuid() + fileName);
                file.SaveAs(path);
                file.InputStream.Flush(); 

                file.InputStream.Close();
                file.InputStream.Dispose();

                // Import the file
                ViewData["FileName"] = fileName;
                //Added to ensure that the file had finished being written by the time      I try and read it
                System.Threading.Thread.Sleep(2000);
            }

            return RedirectToAction("Index", new{fileName = path});
        }

上記のコードはファイルを読み取り、問題なく保存しますが、以下はそのファイルのロードに失敗します。

var workbook = excelApp.Workbooks.Open(ExcelDocumentLocation, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value 、Missing.Value、Missing.Value、Missing.Value、Missing.Value);

エクセルでファイルを開くと「ファイルは別のユーザーによってロックされています」というメッセージが表示され、問題としてファイルがロックされていることを確認しました。

4

1 に答える 1

5

必要なのはfile.SaveAs(path);. をフラッシュまたは閉じる必要はありませんfile.InputStream。これはファイルをロックしません。

それをロックしているのは、そこから読み取っているコードです。ASP.NET MVC アプリケーションで Office Interop を使用しているようです。使用しないでください。これは、ASP.NET アプリケーションなどのマルチスレッド環境で使用することを意図したものではありません。Office Interop の問題点は、MS Office をサーバーにインストールする必要があるということです。ファイルをロックしているのは MS Office プロセスであり、単純にファイルをディスクに保存した ASP.NET MVC アプリケーションではありません。

サーバー上の Office ドキュメントを操作する場合は、 OpenXML SDKを使用できます。

于 2012-10-08T10:05:17.057 に答える