Esempio n. 1
0
 public void Dispose()
 {
     isDisposed = true;
     UploadingStreamsByGuid.TryRemove(CurrentFileInfoCache.Id, out StreamIdentifierCache streamIdentifier);
     try
     {
         CurrentStream.Dispose();
     }
     catch (Exception ex)
     {
     }
 }
Esempio n. 2
0
        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();
            }
        }