C# 杀死Excel或Csv文件上的锁
我有一个过程,它在excel和csv文件集合上循环,并将数据拉回到数据表中进行处理:C# 杀死Excel或Csv文件上的锁,c#,excel,csv,C#,Excel,Csv,我有一个过程,它在excel和csv文件集合上循环,并将数据拉回到数据表中进行处理: public static DataTable Get(string path, bool IsFirstRowHeader) { var header = "No"; var sql = string.Empty; DataTable dataTable = null; var pathOnly = string.Empty;
public static DataTable Get(string path, bool IsFirstRowHeader)
{
var header = "No";
var sql = string.Empty;
DataTable dataTable = null;
var pathOnly = string.Empty;
var fileName = string.Empty;
try
{
pathOnly = Path.GetDirectoryName(path);
fileName = Path.GetFileName(path);
sql = @"SELECT * FROM [" + fileName + "]";
if (IsFirstRowHeader) { header = "Yes"; }
using (var connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';"))
{
using (var command = new OleDbCommand(sql, connection))
{
using (var adapter = new OleDbDataAdapter(command))
{
dataTable = new DataTable {Locale = CultureInfo.CurrentCulture};
adapter.Fill(dataTable);
}
}
}
}
catch(Exception ex)
{
ErrorLog.Log();
}
return dataTable;
}
但是,如果用户正在查看此文件,则会出现以下错误:
The Microsoft Jet database engine cannot open the file
'\\cjserver\IS_CalendarImport\Staging\12-03-13done'. It is already opened exclusively
by another user, or you need permission to view its data.
是否有一种方法(最好是代码,C#)可以自动释放或绕过锁?不知道如何使用Jet绕过锁(可能不可能),但在大多数情况下,您可以在使用文件时复制该文件
因此,一个简单的解决方法是将文件复制到临时目录中,并根据临时文件查询数据。理论上,遍历windows内部函数等。是的可以杀死锁——事实上,就是这样。然而,在一般情况下,这是不明智的,因为程序不希望锁由于外部进程而神奇地消失 在尝试使用该文件之前,测试该文件以查看是否可以打开它是一个好策略(尝试直接在c#代码中打开该文件) 如果无法用c代码打开文件,可以采用以下策略之一: 1) 只需跳过该文件——可能还有跳过文件的用户、管理员等信息 2) 稍后重试该文件,如果重试次数太多而未成功,则恢复为跳过清除
3) 在我打字时,我看到DarrenMB已经建议复制文件——并使用副本。Excel将始终以独占方式打开文件,防止其他人访问这些文件。