2

Excelファイルのインポートに使用しているサービスがあります。実装を以下に示します。

[Attributes.ImportFileExtension(Extension=".xls")]
[Attributes.ImportFileExtension(Extension=".xlt")]
[Attributes.ImportFileExtension(Extension=".xlsx")]
public class ExcelImportService:FileImportServiceBase,IFileImportService
{
    public DataSet Import(System.IO.Stream fileStream)
    {
        IExcelDataReader excelReader = null;
        switch (Extension)
        {
            case ".xls":
            case ".xlt":
                excelReader = ExcelReaderFactory.CreateBinaryReader(fileStream);
                break;
            case ".xlsx":
                excelReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
                break;
        }
        excelReader.IsFirstRowAsColumnNames = true;
        DataSet dataSet = excelReader.AsDataSet();
        return dataSet;
    }
}

さらに、作成中のファクトリを介してこのサービスを呼び出す次のコードがあります。このサービスを呼び出すためのコードを以下に示します。

        try
        {
            var extension = Path.GetExtension(dialog.FileName);
            var importService = FileImportServiceFactory.Create(extension);
            var stream = dialog.OpenFile();
            var data = importService.Import(stream);
            stream.Close();
            stream.Dispose();

            var result = new FileImportedMessage { Data = data };
            result.Dispatch();
        }
        catch (Exception e)
        {
            MessageDispatcher.Dispatch(new ExceptionMessage(e));
        }

インポートは、インポート中にファイルが開いていない限り、検出されます。

2つの質問があります:

1)この状況に対処するためのベストプラクティス/戦略は何ですか?

2)どうすればよいですか、またはこれを処理する必要がありますか?

4

1 に答える 1

0

問題は、ファイルを読み取り専用モードで開いていて、加算プログラムが読み取り/書き込みモードでファイルを開くと、ファイルがロックされることです。

選択肢は2つだけです。

1-貪欲な方法でファイルを読み取り/書き込みモードで開き、プログラムに対してのみファイルをロックします。

2-(ファイルが大きくない場合のみ)ファイル全体をメモリストリームに読み取り、そこから処理します。

于 2013-03-04T14:19:05.197 に答える