Попробуйте это:
System.IO.FileStream fs;
try
{
startTime = DateTime.Now;
fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite);
IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs);
excelReader2007.IsFirstRowAsColumnNames = false;
DataSet result = excelReader2007.AsDataSet();
if (result.Tables.Count > 0)
{
ds = result;
}
InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel");
}
catch (Exception ex)
{
InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message));
}
finally
{
if (fs != null){
try{
fs.Close();
fs.Dispose();
}
catch(Exception ex){
//Error handling for being unable to close file
}
}
}
Это звучит, как вы покидаете файл открыт предыдущего запуска выполнения и не закрыли его должным образом, это, надеюсь, решит вашу проблему. Если нет, проверьте, чтобы увидеть, если что-то еще по-прежнему использует файл
Или вы можете использовать функцию using
так, что она закрывает использование файлов для вас, смотрите here
[редактировать] Пример using
функции (Вам также может понадобиться использовать using
на вашем IExcelDataReader, но я не проверял API):
try
{
using(System.IO.FileStream fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite))
{
startTime = DateTime.Now;
IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs);
excelReader2007.IsFirstRowAsColumnNames = false;
DataSet result = excelReader2007.AsDataSet();
if (result.Tables.Count > 0)
{
ds = result;
}
InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel");
}
}
catch (Exception ex)
{
InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message));
}
[Edit2]
Проблема, вызвана системами NTFS Setti нг флаг говоря, что это небезопасно, вам нужно использовать следующий код и вызвать его, прежде чем доступ к файлу для его разблокировки:
public class FileUnblocker {
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeleteFile(string name);
public bool Unblock(string fileName) {
return DeleteFile(fileName+ ":Zone.Identifier");
}
}
Source
Таким образом, ваш результирующий код будет:
try
{
if (new FileUnblocker().Unblock(FullfilePath))
{
using(System.IO.FileStream fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite))
{
startTime = DateTime.Now;
IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs);
excelReader2007.IsFirstRowAsColumnNames = false;
DataSet result = excelReader2007.AsDataSet();
if (result.Tables.Count > 0)
{
ds = result;
}
InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel");
}
}
else{
//Issue with unblocking, deal with it here
}
}
catch (Exception ex)
{
InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message));
}
На какой строке возникает ошибка нулевого указателя? Для тех, кто не видит ссылку: http://i.stack.imgur.com/kLt7F.png – Draken
ОК, в дальнейшем анализ, похоже, произойдет на этом этапе: 'InsertExecLogDetails()' Что делает этот метод делать? Можете ли вы опубликовать пример? – Draken
IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader (fs); здесь fs остается null –