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); }
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); }
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); }
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); }
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); } }