public void Transfer() { try { bool result = true; if (clean) { Clean(dest); } foreach (IPhoto photo in selection.Items) { //FIXME need to implement the uniquename as a filter using (FilterRequest request = new FilterRequest(photo.DefaultVersion.Uri)) { GLib.File source = FileFactory.NewForUri(request.Current.ToString()); GLib.File target = UniqueName(dest, photo.Name); FileProgressCallback cb = Progress; progress_dialog.Message = string.Format(Catalog.GetString("Transferring picture \"{0}\" To CD"), photo.Name); progress_dialog.Fraction = photo_index / (double)selection.Count; progress_dialog.ProgressText = string.Format(Catalog.GetString("{0} of {1}"), photo_index, selection.Count); result &= source.Copy(target, FileCopyFlags.None, null, cb); } photo_index++; } // FIXME the error dialog here is ugly and needs improvement when strings are not frozen. if (result) { progress_dialog.Message = Catalog.GetString("Done Sending Photos"); progress_dialog.Fraction = 1.0; progress_dialog.ProgressText = Catalog.GetString("Transfer Complete"); progress_dialog.ButtonLabel = Gtk.Stock.Ok; progress_dialog.Hide(); burner.Run(); } else { throw new Exception(string.Format("{0}{3}{1}{3}{2}", progress_dialog.Message, Catalog.GetString("Error While Transferring"), result.ToString(), Environment.NewLine)); } } catch (Exception e) { Hyena.Log.DebugException(e); progress_dialog.Message = e.ToString(); progress_dialog.ProgressText = Catalog.GetString("Error Transferring"); return; } ThreadAssist.ProxyToMain(() => { progress_dialog.Destroy(); }); }
public void Transfer() { try { #if GIO_2_16 bool result = true; #else Gnome.Vfs.Result result = Gnome.Vfs.Result.Ok; #endif if (clean) #if GIO_2_16 { Clean(dest); } #else { Clean(); } #endif foreach (IBrowsableItem photo in selection.Items) { //FIXME need to implement the uniquename as a filter using (FilterRequest request = new FilterRequest(photo.DefaultVersionUri)) { if (rotate) { new OrientationFilter().Convert(request); } #if GIO_2_16 GLib.File source = FileFactory.NewForUri(request.Current.ToString()); #else Gnome.Vfs.Uri source = new Gnome.Vfs.Uri(request.Current.ToString()); Gnome.Vfs.Uri target = dest.Clone(); #endif #if GIO_2_16 GLib.File target = UniqueName(dest, photo.Name); FileProgressCallback cb = Progress; #else target = UniqueName(target, photo.Name); Gnome.Vfs.XferProgressCallback cb = new Gnome.Vfs.XferProgressCallback(Progress); #endif progress_dialog.Message = System.String.Format(Catalog.GetString("Transferring picture \"{0}\" To CD"), photo.Name); progress_dialog.Fraction = photo_index / (double)selection.Count; progress_dialog.ProgressText = System.String.Format(Catalog.GetString("{0} of {1}"), photo_index, selection.Count); #if GIO_2_16 result &= source.Copy(target, FileCopyFlags.None, null, cb); #else result = Gnome.Vfs.Xfer.XferUri(source, target, Gnome.Vfs.XferOptions.Default, Gnome.Vfs.XferErrorMode.Abort, Gnome.Vfs.XferOverwriteMode.Replace, cb); #endif } photo_index++; } // FIXME the error dialog here is ugly and needs improvement when strings are not frozen. #if GIO_2_16 if (result) { #else if (result == Gnome.Vfs.Result.Ok) { #endif progress_dialog.Message = Catalog.GetString("Done Sending Photos"); progress_dialog.Fraction = 1.0; progress_dialog.ProgressText = Catalog.GetString("Transfer Complete"); progress_dialog.ButtonLabel = Gtk.Stock.Ok; progress_dialog.Hide(); system("nautilus-cd-burner"); } else { throw new System.Exception(System.String.Format("{0}{3}{1}{3}{2}", progress_dialog.Message, Catalog.GetString("Error While Transferring"), result.ToString(), System.Environment.NewLine)); } } catch (System.Exception e) { progress_dialog.Message = e.ToString(); progress_dialog.ProgressText = Catalog.GetString("Error Transferring"); return; } Gtk.Application.Invoke(this.Destroy); }
static void Recursive_Copy(GLib.File source, GLib.File dest, FileCopyFlags flags, ref long copiedBytes, long totalBytes, FileProgressCallback progress_cb) { if (IO.File.Exists(source.Path)) { source.Copy(dest, flags, null, (current, total) => { progress_cb.Invoke(current, totalBytes); }); return; } foreach (GLib.File subdir in source.SubDirs()) { dest.GetChild(subdir.Basename).MakeDirectoryWithParents(null); // if it's a directory, continue the recursion Recursive_Copy(subdir, dest.GetChild(subdir.Basename), flags, ref copiedBytes, totalBytes, progress_cb); } foreach (File child in source.GetFiles()) { long copied = copiedBytes; child.Copy(dest.GetChild(child.Basename), flags, null, (current, total) => { progress_cb.Invoke(copied + current, totalBytes); }); copiedBytes += child.GetSize(); } }
// This is the recursive equivalent of GLib.File.Copy () /// <summary> /// Recursive equivalent to GLib.File.Copy () when called on a directory. /// Functionally equivalent to GLib.File.Copy () when called on files. /// </summary> /// <param name="source"> /// A <see cref="GLib.File"/> /// </param> /// <param name="dest"> /// A <see cref="GLib.File"/> /// </param> /// <param name="flags"> /// A <see cref="FileCopyFlags"/> /// </param> /// <param name="progress_cb"> /// A <see cref="FileProgressCallback"/> /// </param> public static void Copy_Recurse(this GLib.File source, GLib.File dest, FileCopyFlags flags, FileProgressCallback progress_cb) { long totalBytes = source.GetSize(); long copiedBytes = 0; Recursive_Copy(source, dest, flags, ref copiedBytes, totalBytes, progress_cb); }