保存并删除使用 HttpPostedFileBase 保存的 Excel 个文件
Save and delete Excel file saved using HttpPostedFileBase
我正在上传一个 Excel 文件并从中提取数据并将其保存到数据库中。我正在使用 MVC4 .NET 框架。这是我来自 class:
的代码
public static void Upload(HttpPostedFileBase File)
{
NIKEntities1 obj = new NIKEntities1();
MyApp = new Excel.Application();
MyApp.Visible = false;
string extension = System.IO.Path.GetExtension(File.FileName);
string pic = "Excel" + extension;
string path = System.IO.Path.Combine(System.Web.HttpContext.Current.Server.MapPath("~/Excel"), pic);
File.SaveAs(path);
MyBook = MyApp.Workbooks.Open(path);
MySheet = (Excel.Worksheet)MyBook.Sheets[1]; // Explicit cast is not required here
int lastRow = MySheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row;
List<Employee> EmpList = new List<Employee>();
for (int index = 2; index <= lastRow; index++)
{
System.Array MyValues = (System.Array)MySheet.get_Range("A" +
index.ToString(), "B" + index.ToString()).Cells.Value;
EmpList.Add(new Employee
{
BatchID = MyValues.GetValue(1, 1).ToString(),
BatchName = MyValues.GetValue(1, 2).ToString()
});
}
for (int i = 0; i < EmpList.Count; i++)
{
int x=obj.USP_InsertBatches(EmpList[i].BatchID, EmpList[i].BatchName);
}
}
}
class Employee
{
public string BatchID;
public string BatchName;
}
这段代码第一次运行完美,但下次它说该文件当前正在使用中。所以我想到使用以下行删除代码末尾的文件:
File.Delete(path);
但是这一行抛出了错误:
HttpPostedFileBase does not contain definition for Delete
此外,如果我不写这一行并尝试再次执行代码,它会说它无法保存,因为存在同名文件并且无法替换,因为它当前正在使用中。
我应该怎么做才能摆脱这个:
(File.Delete()) Error
访问我收到但不保存的 Excel 文件的任何其他方式也将非常有用,因为我只需访问一次数据。
你在那里使用的File
是你的变量,它是你方法的输入参数。该参数的类型为 HttpPostedFileBase
and that type has no instance methods(也不是静态类型),允许您删除该 File
实例。
您可能正在寻找 System.IO
命名空间中 File
类型的静态 Delete
方法。
快速解决方法是明确说明您的意思 File
:
System.IO.File.Delete(path);
不过,您可能需要为变量考虑不同的命名准则。在 C# 中,我们倾向于编写以小写字母开头的变量。框架中的几乎所有类型都以大写字母开头。这使得区分事物 file
和类型 File
.
变得更容易
请注意,只有当文件被所有进程关闭并且所有文件句柄都被文件系统清除时,文件才能被删除。在您的情况下,您必须确保 Excel 关闭文件并释放它的句柄。如果您有搜索索引器 运行 或粗略的病毒扫描程序,您可能需要尝试几次才能放弃。
我通常使用这个代码:
// make sure here all Ole Automation servers (like Excel or Word)
// have closed the file (so close the workbook, document etc)
// we iterate a couple of times (10 in this case)
for(int i=0; i< 10; i++)
{
try
{
System.IO.File.Delete(path);
break;
} catch (Exception exc)
{
Trace.WriteLine("failed delete {0}", exc.Message);
// let other threads do some work first
// http://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/
Thread.Sleep(0);
}
}
据我所知,您正在打开 Excel、读取文件但从未关闭 Excel。
添加:
MyApp.Workbooks.Close();
MyApp.Quit();
在上传功能结束时。更好的是,包装你得到的整个代码
try{
//here goes your current code
}
catch(Exception e)
{
//manage exception
}
finally
{
MyApp.Workbooks.Close();
MyApp.Quit();
}
您在 try catch 块之外初始化 MyApp,然后无论发生什么情况都关闭文件。
我正在上传一个 Excel 文件并从中提取数据并将其保存到数据库中。我正在使用 MVC4 .NET 框架。这是我来自 class:
的代码 public static void Upload(HttpPostedFileBase File)
{
NIKEntities1 obj = new NIKEntities1();
MyApp = new Excel.Application();
MyApp.Visible = false;
string extension = System.IO.Path.GetExtension(File.FileName);
string pic = "Excel" + extension;
string path = System.IO.Path.Combine(System.Web.HttpContext.Current.Server.MapPath("~/Excel"), pic);
File.SaveAs(path);
MyBook = MyApp.Workbooks.Open(path);
MySheet = (Excel.Worksheet)MyBook.Sheets[1]; // Explicit cast is not required here
int lastRow = MySheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row;
List<Employee> EmpList = new List<Employee>();
for (int index = 2; index <= lastRow; index++)
{
System.Array MyValues = (System.Array)MySheet.get_Range("A" +
index.ToString(), "B" + index.ToString()).Cells.Value;
EmpList.Add(new Employee
{
BatchID = MyValues.GetValue(1, 1).ToString(),
BatchName = MyValues.GetValue(1, 2).ToString()
});
}
for (int i = 0; i < EmpList.Count; i++)
{
int x=obj.USP_InsertBatches(EmpList[i].BatchID, EmpList[i].BatchName);
}
}
}
class Employee
{
public string BatchID;
public string BatchName;
}
这段代码第一次运行完美,但下次它说该文件当前正在使用中。所以我想到使用以下行删除代码末尾的文件:
File.Delete(path);
但是这一行抛出了错误:
HttpPostedFileBase does not contain definition for Delete
此外,如果我不写这一行并尝试再次执行代码,它会说它无法保存,因为存在同名文件并且无法替换,因为它当前正在使用中。
我应该怎么做才能摆脱这个:
(File.Delete()) Error
访问我收到但不保存的 Excel 文件的任何其他方式也将非常有用,因为我只需访问一次数据。
你在那里使用的File
是你的变量,它是你方法的输入参数。该参数的类型为 HttpPostedFileBase
and that type has no instance methods(也不是静态类型),允许您删除该 File
实例。
您可能正在寻找 System.IO
命名空间中 File
类型的静态 Delete
方法。
快速解决方法是明确说明您的意思 File
:
System.IO.File.Delete(path);
不过,您可能需要为变量考虑不同的命名准则。在 C# 中,我们倾向于编写以小写字母开头的变量。框架中的几乎所有类型都以大写字母开头。这使得区分事物 file
和类型 File
.
请注意,只有当文件被所有进程关闭并且所有文件句柄都被文件系统清除时,文件才能被删除。在您的情况下,您必须确保 Excel 关闭文件并释放它的句柄。如果您有搜索索引器 运行 或粗略的病毒扫描程序,您可能需要尝试几次才能放弃。
我通常使用这个代码:
// make sure here all Ole Automation servers (like Excel or Word)
// have closed the file (so close the workbook, document etc)
// we iterate a couple of times (10 in this case)
for(int i=0; i< 10; i++)
{
try
{
System.IO.File.Delete(path);
break;
} catch (Exception exc)
{
Trace.WriteLine("failed delete {0}", exc.Message);
// let other threads do some work first
// http://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/
Thread.Sleep(0);
}
}
据我所知,您正在打开 Excel、读取文件但从未关闭 Excel。
添加:
MyApp.Workbooks.Close();
MyApp.Quit();
在上传功能结束时。更好的是,包装你得到的整个代码
try{
//here goes your current code
}
catch(Exception e)
{
//manage exception
}
finally
{
MyApp.Workbooks.Close();
MyApp.Quit();
}
您在 try catch 块之外初始化 MyApp,然后无论发生什么情况都关闭文件。