示例#1
0
        /// <summary>
        /// 把数据写入卡片的某个扇区的某些块中
        /// </summary>
        /// <param name="cardID">需写入卡片的卡号(为null或空时不检查卡号)</param>
        /// <param name="section">扇区(0~15)</param>
        /// <param name="block">起始块号(0~3)</param>
        /// <param name="ucExt">写入块数(1~3)</param>
        /// <param name="pBuf">写入数据</param>
        /// <param name="key">密钥</param>
        /// <param name="successBuz">成功是否发出提示音</param>
        /// <param name="failBuz">失败是否发出提示音</param>
        /// <param name="loop">是否循环写入,直到写入成功或取消写入</param>
        /// <param name="initKey">密钥验证失败后,是否初始化扇出密钥</param>
        /// <returns></returns>
        public CardOperationResultCode WriteSection(string cardID, int section, int block, byte ucExt, byte[] pBuf, byte[] key, bool successBuz, bool failBuz, bool loop, bool initKey)
        {
            bool originalStarted = _Started;

            if (originalStarted)
            {
                StopReadCard();   //正在读卡,先停止
                WaitForReading(); //等待读卡完成
            }

            CardOperationResultCode result = CardOperationResultCode.InitFail;

            try
            {
                while (true)
                {
                    if (HadActiveReader)
                    {
                        result = _ActiveReader.WriteSection(cardID, section, block, ucExt, pBuf, key, successBuz, failBuz, initKey);
                    }
                    else
                    {
                        foreach (ICardReader reader in _Readers)
                        {
                            result = reader.WriteSection(cardID, section, block, ucExt, pBuf, key, successBuz, failBuz, initKey);
                            if (result == CardOperationResultCode.Success)
                            {
                                _ActiveReader = reader;
                                break;
                            }
                        }
                    }

                    if (!loop || result == CardOperationResultCode.Success)
                    {
                        break;//退出循环写入
                    }
                    else
                    {
                        string msg = "信息未能写入卡片,是否重新写入?";
                        switch (result)
                        {
                        case CardOperationResultCode.Success:
                            break;

                        case CardOperationResultCode.NoCard:
                            msg += string.Format("\r\n原因:{0}", "没有卡片!");
                            break;

                        case CardOperationResultCode.CardIDError:
                            msg += string.Format("\r\n原因:{0}", "卡片不是当前发行的卡片!");
                            break;

                        case CardOperationResultCode.AuthFail:
                        case CardOperationResultCode.Fail:
                            msg += string.Format("\r\n原因:{0}", "卡片不是有效卡片!");
                            break;

                        case CardOperationResultCode.InitFail:
                        case CardOperationResultCode.OpenFail:
                            msg += string.Format("\r\n原因:{0}", "打开读卡器失败!");
                            break;

                        default:
                            break;
                        }

                        if (System.Windows.Forms.MessageBox.Show(msg, "询问?",
                                                                 System.Windows.Forms.MessageBoxButtons.YesNo,
                                                                 System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No)
                        {
                            break;//退出循环写入
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
            }
            catch (Exception ex)
            {
                ExceptionPolicy.HandleException(ex);
            }
            if (originalStarted)
            {
                BeginReadCard();                 //恢复读卡
            }
            return(result);
        }