public void Dispose() { isDisposed = true; UploadingStreamsByGuid.TryRemove(CurrentFileInfoCache.Id, out StreamIdentifierCache streamIdentifier); try { CurrentStream.Dispose(); } catch (Exception ex) { } }
public StreamIdentifierFileUploadResult StartUpload(FileInfoCache fileInfoCache, Stream streamToSave, long startPosition, long length) { try { CurrentFileInfoCache = fileInfoCache; CurrentStream = streamToSave; bool haveToRemove = false; StreamIdentifierCache disposeStreamIdentifier = null; lock (staticLock) { if (UploadingStreamsByGuid.TryGetValue(fileInfoCache.Id, out disposeStreamIdentifier)) { haveToRemove = true; } else { UploadingStreamsByGuid.TryAdd(fileInfoCache.Id, this); } } if (haveToRemove) { disposeStreamIdentifier.Dispose(); } var folderPath = GetCachFolderPath(fileInfoCache.Id); if (!CrossDirectoryInfo.Current.Exists(folderPath)) { CrossDirectoryInfo.Current.CreateDirectory(folderPath); } var filePath = Path.Combine(folderPath, "file"); var dataPath = Path.Combine(folderPath, "data"); CrossFileInfo.Current.WriteAllText(dataPath, JsonConvert.SerializeObject(fileInfoCache), Encoding.UTF8); using (FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { fileStream.Seek(startPosition, SeekOrigin.Begin); byte[] readBytes = new byte[1024 * 200]; long writed = 0; while (!isDisposed) { var readCount = streamToSave.Read(readBytes, 0, readBytes.Length); if (readCount <= 0) { break; } fileStream.Write(readBytes, 0, readCount); writed += readCount; if (writed == length) { break; } } if (fileStream.Length > fileInfoCache.FileSize) { fileStream.SetLength(fileInfoCache.FileSize); } if (fileStream.Length == fileInfoCache.FileSize) { fileStream.Seek(0, SeekOrigin.Begin); var checkSum = FileChecksumMaker.GetFileCheckSum(fileStream); var errors = FileChecksumMaker.GetErrorsFromTwoCheckSum(checkSum, fileInfoCache.FileChecksumInfo); if (errors.Count == 0) { return(StreamIdentifierFileUploadResult.Success); } else { return(StreamIdentifierFileUploadResult.FileCheckSumIsWrong); } } else { return(StreamIdentifierFileUploadResult.FileSizeIsWrong); } } } catch (Exception ex) { return(StreamIdentifierFileUploadResult.Exception); } finally { Dispose(); } }