public static void MoveCacheToFile(StreamIdentifier <TId> streamIdentifier, Guid cacheId, TId fileId) { var cacheFolder = StreamIdentifierCache.GetCachFolderPath(cacheId); var fileCachePath = Path.Combine(cacheFolder, "file"); var dataCachePath = Path.Combine(cacheFolder, "data"); var saveFolder = streamIdentifier.DirectoryManager.GetFolderPath(fileId); if (CrossDirectoryInfo.Current.Exists(saveFolder)) { throw new Exception("directory exist!"); } CrossDirectoryInfo.Current.CreateDirectory(saveFolder); CrossFileInfo.Current.Move(fileCachePath, Path.Combine(saveFolder, "file")); var dataCache = JsonConvert.DeserializeObject <FileInfoCache>(CrossFileInfo.Current.ReadAllText(dataCachePath, Encoding.UTF8)); FileInfo <TId> fileInfo = new FileInfo <TId>() { CreatedDateTime = DateTime.Now, Id = fileId, FileName = dataCache.FileName, FileSize = dataCache.FileSize, IsComplete = true, DataType = dataCache.DataType }; CrossFileInfo.Current.WriteAllText(Path.Combine(saveFolder, "data"), JsonConvert.SerializeObject(fileInfo), Encoding.UTF8); DeleteFolder(cacheId); }
internal static bool DeleteFolder(Guid cacheId) { try { var saveFolder = StreamIdentifierCache.GetCachFolderPath(cacheId); while (saveFolder.Length > StreamIdentifierCache.DefaultCacheFolderPath.Length) { if (CrossDirectoryInfo.Current.GetDirectories(saveFolder).Length == 0) { CrossDirectoryInfo.Current.Delete(saveFolder, true); } else { break; } saveFolder = Path.GetDirectoryName(saveFolder); } return(true); } catch (Exception ex) { return(false); } }
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(); } }