杀死Excel或Csv文件上的locking

我有一个循环的excel和csv文件集合的过程,并将数据拉回到数据表进行处理:

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#)自动释放或规避locking?

从理论上讲,通过Windows内部函数,是的,可以杀死锁 – 事实上, 解锁工具就是这样做的。 然而,在一般情况下,这是不明智的,因为程序不希望locking由于外部过程而奇迹般地消失。

testing文件,看看你是否可以打开它之前尝试使用它是一个很好的策略(尝试直接在您的C#代码中打开文件)。

如果您无法在c#代码中打开该文件,则可以按照以下一种策略进行操作:

1)只是跳过文件 – 也许信息用户,pipe理员等跳过的文件2)稍后重试文件,恢复跳过太多的重试没有成功后,杀死3)当我打字,我看到DarrenMB已经build议复制该文件 – 并使用该副本。

不知道如何规避与Jet的锁(可能不可能),但你可以复制文件,而在大多数情况下使用它。

所以一个简单的解决方法是将文件复制到一个临时目录中,并根据临时文件查询您的数据。