private static void Uploadfile(string localfilename, int i, string remotefilename, IBackend backend, bool disableStreaming) { Console.Write("Uploading file {0}, {1} ... ", i, Duplicati.Library.Utility.Utility.FormatSizeString(new System.IO.FileInfo(localfilename).Length)); Exception e = null; try { if (backend is Library.Interface.IStreamingBackend && !disableStreaming) { using (System.IO.FileStream fs = new System.IO.FileStream(localfilename, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)) using (NonSeekableStream nss = new NonSeekableStream(fs)) (backend as Library.Interface.IStreamingBackend).PutAsync(remotefilename, nss, CancellationToken.None).Wait(); } else { backend.PutAsync(remotefilename, localfilename, CancellationToken.None).Wait(); } e = null; } catch (Exception ex) { e = ex; } if (e != null) { Console.WriteLine("Failed to upload file {0}, error message: {1}, remote name: {2}", i, e, remotefilename); while (e.InnerException != null) { e = e.InnerException; Console.WriteLine(string.Format(" Inner exception: {0}", e)); } } else { Console.WriteLine(" done!"); } }
private async Task DoPut(FileEntryItem item, IBackend backend, CancellationToken cancelToken) { if (cancelToken.IsCancellationRequested) { return; } if (item.TrackedInDb) { await m_database.UpdateRemoteVolumeAsync(item.RemoteFilename, RemoteVolumeState.Uploading, item.Size, item.Hash); } if (m_options.Dryrun) { Logging.Log.WriteDryrunMessage(LOGTAG, "WouldUploadVolume", "Would upload volume: {0}, size: {1}", item.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(item.LocalFilename).Length)); item.DeleteLocalFile(); return; } await m_database.LogRemoteOperationAsync("put", item.RemoteFilename, JsonConvert.SerializeObject(new { Size = item.Size, Hash = item.Hash })); await m_stats.SendEventAsync(BackendActionType.Put, BackendEventType.Started, item.RemoteFilename, item.Size, updateProgress : false); m_progressUpdater.StartFileProgress(item.RemoteFilename, item.Size); var begin = DateTime.Now; if (!m_options.DisableStreamingTransfers && backend is IStreamingBackend streamingBackend) { // A download throttle speed is not given to the ThrottledStream as we are only uploading data here using (var fs = File.OpenRead(item.LocalFilename)) using (var ts = new ThrottledStream(fs, m_initialUploadThrottleSpeed, 0)) using (var pgs = new ProgressReportingStream(ts, pg => HandleProgress(ts, pg, item.RemoteFilename))) await streamingBackend.PutAsync(item.RemoteFilename, pgs, cancelToken).ConfigureAwait(false); } else { await backend.PutAsync(item.RemoteFilename, item.LocalFilename, cancelToken).ConfigureAwait(false); } var duration = DateTime.Now - begin; m_progressUpdater.EndFileProgress(item.RemoteFilename); Logging.Log.WriteProfilingMessage(LOGTAG, "UploadSpeed", "Uploaded {0} in {1}, {2}/s", Library.Utility.Utility.FormatSizeString(item.Size), duration, Library.Utility.Utility.FormatSizeString((long)(item.Size / duration.TotalSeconds))); if (item.TrackedInDb) { await m_database.UpdateRemoteVolumeAsync(item.RemoteFilename, RemoteVolumeState.Uploaded, item.Size, item.Hash); } await m_stats.SendEventAsync(BackendActionType.Put, BackendEventType.Completed, item.RemoteFilename, item.Size); if (m_options.ListVerifyUploads) { var f = backend.List().FirstOrDefault(n => n.Name.Equals(item.RemoteFilename, StringComparison.OrdinalIgnoreCase)); if (f == null) { throw new Exception(string.Format("List verify failed, file was not found after upload: {0}", item.RemoteFilename)); } else if (f.Size != item.Size && f.Size >= 0) { throw new Exception(string.Format("List verify failed for file: {0}, size was {1} but expected to be {2}", f.Name, f.Size, item.Size)); } } item.DeleteLocalFile(); await m_database.CommitTransactionAsync("CommitAfterUpload"); }