//public bool InUse => _inUse; public SMB2ConnectionClient(string domain, string username, string password, string host, string share) { //INFO dotnet core was having an issue with Code Contracts and required a visual studio extension to resolve if (String.IsNullOrEmpty(domain)) { throw new ArgumentNullException("domainName is required to connect to unc host."); } if (String.IsNullOrEmpty(username)) { throw new ArgumentNullException("username is required to connect to unc host."); } if (String.IsNullOrEmpty(password)) { throw new ArgumentNullException("password is required to connect to unc host."); } if (String.IsNullOrEmpty(host)) { throw new ArgumentNullException("uncHost is required to connect to unc host."); } if (String.IsNullOrEmpty(share)) { throw new ArgumentNullException("uncShare is required to connect to unc host."); } IPAddress ipAddress = Dns.GetHostAddresses(host)[0]; _host = host; _share = share; _connected = base.Connect(ipAddress, SMBTransportType.DirectTCPTransport); if (_connected) { _status = Login(domain, username, password); if (_status == NTStatus.STATUS_SUCCESS) { _smb2FileStore = TreeConnect(_share, out _status) as SMB2FileStore; if (_smb2FileStore == null) { _connected = false; } } } }
public async Task <NamedObjectBytes> GetFileByes(string uncPath, string contentFilename, long?startRange = null, long?endRange = null) { Stopwatch timer = Stopwatch.StartNew(); //Console.WriteLine($"SMB2ConnectionClient.GetFileBytes - CreateFile - PRECONNECT - THREADID:{this.GetHashCode()} NTStatus:{_status} FileStatus:NoConnection HOST:{_host} SHARE:{_share }PATH:{uncPath} FILENAME:{contentFilename} "); _smb2FileStore = TreeConnect(_share, out _status) as SMB2FileStore; if (_smb2FileStore == null) { _connected = false; return(null); } object fileHandle = new object(); FileStatus status; SMBLibrary.FileInformation fileInfo = null; var pathToFile = $"{uncPath}\\{contentFilename}"; _status = _smb2FileStore.CreateFile(out fileHandle, out status, pathToFile, AccessMask.GENERIC_READ, 0, ShareAccess.Read, CreateDisposition.FILE_OPEN, CreateOptions.FILE_NON_DIRECTORY_FILE, null); Console.WriteLine($"SMB2ConnectionClient.GetFileBytes - CreateFile- POSTCONNECT - THREADID:{this.GetHashCode()} NTStatus:{_status} FileStatus:{status} HOST:{_host} SHARE:{_share }PATH:{uncPath} FILENAME:{contentFilename} "); if (_status == NTStatus.STATUS_SUCCESS) { bool read = true; byte[] data = null; int start = (startRange != null && startRange.ToInt(0) >= 0) ? startRange.ToInt(0) : 0; int chunkSize = 65536; _smb2FileStore.GetFileInformation(out fileInfo, fileHandle, FileInformationClass.FileStandardInformation); //is this a ranged call? if (startRange != null && endRange != null) { chunkSize = ((endRange - startRange) < chunkSize) ? (int)(endRange - startRange + 1) : chunkSize; int remainingBytesToRead = endRange.ToInt(0) - startRange.ToInt(0) + 1; while (read) { _smb2FileStore.ReadFile(out var chunk, fileHandle, start, chunkSize); data = data == null ? chunk : data.Concat(chunk).ToArray(); start += chunkSize; remainingBytesToRead -= chunkSize; chunkSize = (remainingBytesToRead < chunkSize) ? remainingBytesToRead : chunkSize; if (remainingBytesToRead <= 0) { read = false; } } _smb2FileStore.CloseFile(fileHandle); return(new NamedObjectBytes() { FileBytes = data, TotalFileLength = ((FileStandardInformation)fileInfo).EndOfFile, RetrieveSpeedMs = timer.Elapsed.TotalMilliseconds }); } while (read) { _smb2FileStore.ReadFile(out var chunk, fileHandle, start, chunkSize); if (chunk == null) { Debugger.Break(); } data = data == null ? chunk : data.Concat(chunk).ToArray(); start += chunkSize; if (chunk == null || chunk.Length < chunkSize) { read = false; } } _smb2FileStore.CloseFile(fileHandle); return(new NamedObjectBytes() { FileBytes = data, TotalFileLength = ((FileStandardInformation)fileInfo).EndOfFile, RetrieveSpeedMs = timer.Elapsed.TotalMilliseconds }); } return(null); }