public void AppendToFile(string fileName, MasterDetails <M, D> record)
 {
     AppendToFile(fileName, new MasterDetails <M, D>[] { record });
 }
        public MasterDetails <M, D>[] ReadStream(TextReader reader)
#endif
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader", "The reader of the Stream cant be null");
            }

            if (mRecordSelector == null)
            {
                throw new BadUsageException("The Recordselector cant be null, please pass a not null Selector in the constructor.");
            }

            ResetFields();
            mHeaderText = String.Empty;
            mFooterText = String.Empty;

            ArrayList resArray = new ArrayList();

            ForwardReader freader = new ForwardReader(reader, mMasterInfo.mIgnoreLast);

            freader.DiscardForward = true;

            string currentLine, completeLine;

            mLineNumber = 1;

            completeLine = freader.ReadNextLine();
            currentLine  = completeLine;

                        #if !MINI
            ProgressHelper.Notify(mNotifyHandler, mProgressMode, 0, -1);
                        #endif
            int currentRecord = 0;

            if (mMasterInfo.mIgnoreFirst > 0)
            {
                for (int i = 0; i < mMasterInfo.mIgnoreFirst && currentLine != null; i++)
                {
                    mHeaderText += currentLine + StringHelper.NewLine;
                    currentLine  = freader.ReadNextLine();
                    mLineNumber++;
                }
            }


            bool byPass = false;

#if !GENERICS
            MasterDetails record = null;
#else
            MasterDetails <M, D> record = null;
#endif
            ArrayList tmpDetails = new ArrayList();

            LineInfo line = new LineInfo(currentLine);
            line.mReader = freader;

            while (currentLine != null)
            {
                try
                {
                    currentRecord++;

                    line.ReLoad(currentLine);

                                        #if !MINI
                    ProgressHelper.Notify(mNotifyHandler, mProgressMode, currentRecord, -1);
                                        #endif

                    RecordAction action = mRecordSelector(currentLine);

                    switch (action)
                    {
                    case RecordAction.Master:
                        if (record != null)
                        {
                                                                #if !GENERICS
                            record.mDetails = tmpDetails.ToArray();
                                                                #else
                            record.mDetails = (D[])tmpDetails.ToArray();
                                                                #endif
                            resArray.Add(record);
                        }

                        mTotalRecords++;
#if !GENERICS
                        record = new MasterDetails();
#else
                        record = new MasterDetails <M, D>();
#endif
                        tmpDetails.Clear();
#if !GENERICS
                        object lastMaster = mMasterInfo.StringToRecord(line);
#else
                        M lastMaster = (M)mMasterInfo.StringToRecord(line);
#endif

                        if (lastMaster != null)
                        {
                            record.mMaster = lastMaster;
                        }

                        break;

                    case RecordAction.Detail:
#if !GENERICS
                        object lastChild = mRecordInfo.StringToRecord(line);
#else
                        D lastChild = (D)mRecordInfo.StringToRecord(line);
#endif

                        if (lastChild != null)
                        {
                            tmpDetails.Add(lastChild);
                        }
                        break;

                    default:
                        break;
                    }
                }
                catch (Exception ex)
                {
                    switch (mErrorManager.ErrorMode)
                    {
                    case ErrorMode.ThrowException:
                        byPass = true;
                        throw;

                    case ErrorMode.IgnoreAndContinue:
                        break;

                    case ErrorMode.SaveAndContinue:
                        ErrorInfo err = new ErrorInfo();
                        err.mLineNumber    = mLineNumber;
                        err.mExceptionInfo = ex;
//							err.mColumnNumber = mColumnNum;
                        err.mRecordString = completeLine;

                        mErrorManager.AddError(err);
                        break;
                    }
                }
                finally
                {
                    if (byPass == false)
                    {
                        currentLine  = freader.ReadNextLine();
                        completeLine = currentLine;
                        mLineNumber  = freader.LineNumber;
                    }
                }
            }

            if (record != null)
            {
#if !GENERICS
                record.mDetails = tmpDetails.ToArray();
#else
                record.mDetails = (D[])tmpDetails.ToArray();
#endif
                resArray.Add(record);
            }

            if (mMasterInfo.mIgnoreLast > 0)
            {
                mFooterText = freader.RemainingText;
            }

#if !GENERICS
            return((MasterDetails[])resArray.ToArray(typeof(MasterDetails)));
#else
            return((MasterDetails <M, D>[])resArray.ToArray(typeof(MasterDetails <M, D>)));
#endif
        }