示例#1
0
        public async Task <byte[]> ReadFile(string fileName, ushort maxWordsLen = 64)
        {
            if (!this._providerResult.IsSuccess)
            {
                return(null);
            }

            if (string.IsNullOrEmpty(this._workDirectory))
            {
                this._workDirectory = await this.ReadDirectory();
            }

            var fileInfo = new OpenedFileInfo();

            if (_openedFiles.ContainsKey(fileName))
            {
                fileInfo = _openedFiles[fileName];
                await CloseFile(fileInfo);
            }

            fileInfo.Access        = FileAccess.ReadFile;
            fileInfo.FileName      = fileName;
            fileInfo.SessionNumber = await this.ReadSessionNumber();
            await OpenFile(fileInfo);

            var dataFile = await ReadData(fileInfo, maxWordsLen);

            await CloseFile(fileInfo);

            return(dataFile);
        }
示例#2
0
        private async Task <byte[]> ReadData(OpenedFileInfo fileInfo, ushort maxWordsLen)
        {
            var data    = new List <ushort>();
            var dataLen = ushort.MaxValue;

            while (dataLen > 0)
            {
                await SendCommand(string.Format(FILEREAD_CMD_PATTERN, fileInfo.Descriptor, maxWordsLen * 2));

                var stateStrings = await this.ReadCommandStateStrings();

                if (stateStrings != null && stateStrings.Length >= 6)
                {
                    dataLen = Convert.ToUInt16(stateStrings[5]);

                    if (dataLen == 0)
                    {
                        return(data.UshortArrayToByteArray(false));
                    }

                    data.AddRange(await ReadDataCommand((ushort)(dataLen / 2)));
                }
                else
                {
                    break;
                }
            }

            throw new FileOperationException(this.LastCommandStatus != 0 ? LastCommandStatus : 255);
        }
示例#3
0
        private async Task OpenFile(OpenedFileInfo fileInfo)
        {
            var counter = 0;

            do
            {
                fileInfo.SessionNumber = await this.ReadSessionNumber();

                var password      = fileInfo.GetPassword();
                var accessStr     = fileInfo.Access == FileAccess.ReadFile ? "1" : "10";
                var descriptorStr = await ReadDataString(string.Format(FILEOPEN_PATTERN, password, accessStr, _workDirectory, fileInfo.FileName));

                if (string.IsNullOrEmpty(descriptorStr))
                {
                    counter++;
                }
                else
                {
                    fileInfo.Descriptor = Convert.ToInt32(descriptorStr);
                    _openedFiles.Add(fileInfo.FileName, fileInfo);
                    return;
                }
            }while (counter < 5);

            throw new FileOperationException(this.LastCommandStatus);
        }
示例#4
0
        public async Task WriteFile(byte[] fileData, string fileName, ushort wordsDataLen = 64)
        {
            if (!this._providerResult.IsSuccess)
            {
                return;
            }

            if (string.IsNullOrEmpty(this._workDirectory))
            {
                this._workDirectory = await this.ReadDirectory();
            }

            var fileInfo = new OpenedFileInfo();

            if (_openedFiles.ContainsKey(fileName))
            {
                fileInfo = _openedFiles[fileName];
                await CloseFile(fileInfo);
            }

            fileInfo.Access   = FileAccess.WriteFile;
            fileInfo.FileName = fileName;

            await OpenFile(fileInfo);

            var dataLength = wordsDataLen * 2;
            var count      = fileData.Length / dataLength;
            var residue    = fileData.Length % dataLength;

            for (var counter = 0; counter < count; counter++)
            {
                byte[] writeData = fileData.Skip(dataLength * counter).Take(dataLength).ToArray();
                await WriteData(fileInfo.Descriptor, writeData, dataLength);
            }

            if (residue != 0)
            {
                var writeData = fileData.Skip(dataLength * count).Take(residue).ToArray();
                await WriteData(fileInfo.Descriptor, writeData, residue);
            }


            await CloseFile(fileInfo);
        }
示例#5
0
        private async Task CloseFile(OpenedFileInfo fileInfo)
        {
            if (_openedFiles.ContainsKey(fileInfo.FileName))
            {
                await SendCommand(string.Format(FILECLOSE_CMD_PATTERN, fileInfo.Descriptor));

                var counter = 0;
                do
                {
                    var stateStrings = await ReadCommandStateStrings();

                    if (LastCommandStatus == 0 || this.LastCommandStatus == 8)
                    {
                        this._openedFiles.Remove(fileInfo.FileName);
                        return;
                    }

                    counter++;
                }while (counter < 5);

                throw new FileOperationException(this.LastCommandStatus);
            }
        }