public async Task <Stream> Create(File file, FileUploadedDelegate onUploaded = null, bool discardEncryption = false) { if (!(await _cloud.GetItemAsync(file.Path, MailRuCloud.ItemType.Folder) is Folder folder)) { throw new DirectoryNotFoundException(file.Path); } Stream stream; bool cryptRequired = _cloud.IsFileExists(CryptFileInfo.FileName, WebDavPath.GetParents(folder.FullPath).ToList()).Any(); if (cryptRequired && !discardEncryption) { if (!_cloud.Account.Credentials.CanCrypt) { throw new Exception($"Cannot upload {file.FullPath} to crypt folder without additional password!"); } // #142 remove crypted file parts if size changed var remoteFile = folder.Files.FirstOrDefault(f => f.FullPath == file.FullPath); if (remoteFile != null) { await _cloud.Remove(remoteFile); } stream = GetCryptoStream(file, onUploaded); } else { stream = GetPlainStream(file, onUploaded); } return(stream); }
/// <summary> /// Убрать все привязки на мёртвые ссылки /// </summary> /// <param name="doWriteHistory"></param> public async Task <int> RemoveDeadLinks(bool doWriteHistory) { var removes = _itemList.Items .AsParallel() .WithDegreeOfParallelism(5) .Select(it => GetItemLink(WebDavPath.Combine(it.MapTo, it.Name)).Result) .Where(itl => itl.IsBad || _cloud.GetItemAsync(itl.MapPath, MailRuCloud.ItemType.Folder, false).Result == null) .ToList(); if (removes.Count == 0) { return(0); } _itemList.Items.RemoveAll(it => removes.Any(rem => WebDavPath.PathEquals(rem.MapPath, it.MapTo) && rem.Name == it.Name)); if (removes.Any()) { if (doWriteHistory) { foreach (var link in removes) { _itemCache.Invalidate(link.FullPath, link.MapPath); } string path = WebDavPath.Combine(WebDavPath.Root, HistoryContainerName); string res = await _cloud.DownloadFileAsString(path); var history = new StringBuilder(res ?? string.Empty); foreach (var link in removes) { history.Append($"{DateTime.Now} REMOVE: {link.Href} {link.Name}\r\n"); } _cloud.UploadFile(path, history.ToString()); } Save(); return(removes.Count); } return(0); }