/// <summary> /// TODO /// </summary> /// <param name="item"></param> /// <param name="newParentNode"></param> /// <returns></returns> public async Task <bool> MoveFile(FSItem item, FSItem newParentNode) { if (newParentNode == null) { return(false); // TODO: throw an exception } if (!newParentNode.IsDir) { return(false); // TODO: throw an exception } await amazon.Nodes.Move(item.Id, newParentNode.Id, item.IsDir); CacheStorage.RemoveItem(item); CacheStorage.RemoveItems(newParentNode.Path); return(true); }
public override bool UIKeyPressed(KeyInfo key) { if (key == null) { throw new ArgumentNullException("key"); } UserWants = UserAction.None; try { switch (key.VirtualKeyCode) { case KeyCode.Enter: if (key.Is()) { //Far.Api.ShowError("Not implemented", new NotImplementedException("Not implemented: "+ CurrentFile.Name)); FarFile file = CurrentFile; if (file == null) { break; } UserWants = UserAction.Enter; if (file.IsDirectory && !IgnoreDirectoryFlag) { break; } var cancellation = new CancellationTokenSource(); var _cancel = cancellation.Token; //var ptask = new ProgressTask("test", "test-title", _cancel); //var form = ptask.ShowDialog(); //Thread.Sleep(3000); //cancellation.Cancel(); //form.Complete(); UIOpenFile(file); return(true); } if (key.IsShift()) { UIAttributes(); return(true); } break; case KeyCode.F1: if (key.Is()) { UIHelp(); return(true); } break; case KeyCode.F3: if (key.Is()) { if (CurrentFile == null) { UIExploreLocation(null); //UIViewAll(); return(true); } /* * if (CurrentFile.IsDirectory) * { * Explorer.CanExploreLocation = true; * break; * } * * Explorer.CanExploreLocation = false; */ break; } if (key.IsShift()) { //ShowMenu(); return(true); } break; /* * case KeyCode.F5: * * if (key.Is()) * { * if (CurrentFile == null) * { * //UIViewAll(); * return true; * } * * Log.Source.TraceInformation("Tried to copy this file: {0}\\{1}", CurrentLocation, CurrentFile.Name); * * Log.Source.TraceInformation("Far.Api.Panel2.IsPlugin = {0}", Far.Api.Panel2.IsPlugin ? "true" : "false"); * Log.Source.TraceInformation("Far.Api.Panel2.CurrentFile = {0}", Far.Api.Panel2.CurrentFile); * Log.Source.TraceInformation("Far.Api.Panel2.CurrentDirectory = {0}", Far.Api.Panel2.CurrentDirectory); * * if (Far.Api.Panel2.IsPlugin) * { * // How to copy files to plugins?? * return true; * } * * if (Far.Api.Panel2.CurrentDirectory == null) * { * // how can it be? * return true; * } * * var item = ((CurrentFile.Data as Hashtable)["fsitem"] as FSItem); * var path = Path.Combine(Far.Api.Panel2.CurrentDirectory, item.Name); * * var form = new Tools.ProgressForm(); * form.Activity = "Downloading..."; * form.Title = "Amazon Cloud Drive - File Download Progress"; * form.CanCancel = true; * form.SetProgressValue(0, item.Length); * form.Canceled += (object sender, EventArgs e) => * { * form.Close(); * }; * * Task task = (Explorer as ACDExplorer).Client.DownloadFile(item, path, form); * var cs = new CancellationTokenSource(); * var token = cs.Token; * / * * token.Register(() => * { * form.Close(); * });* / * var _task = Task.Factory.StartNew(() => * { * form.Show(); * }, token); * task.Wait(); * * break; * } * * if (key.IsShift()) * { * //ShowMenu(); * return true; * } * * break; */ case KeyCode.PageDown: if (key.IsCtrl()) { UIOpenFileMembers(); return(true); } break; case KeyCode.A: if (key.IsCtrl()) { UIAttributes(); return(true); } break; case KeyCode.G: if (key.IsCtrl()) { UIApply(); return(true); } break; case KeyCode.M: if (key.IsCtrlShift()) { UIMode(); return(true); } break; case KeyCode.S: //! Mantis#2635 Ignore if auto-completion menu is opened if (key.IsCtrl() && Far.Api.Window.Kind != WindowKind.Menu) { SaveData(); return(true); } break; case KeyCode.R: if (key.IsCtrl()) { CacheStorage.RemoveItems(Far.Api.Panel.CurrentDirectory); } break; } // base return(base.UIKeyPressed(key)); } finally { UserWants = UserAction.None; } }
/// <summary> /// TODO /// </summary> /// <param name="item"></param> /// <param name="newName"></param> /// <returns></returns> public async Task <bool> RenameFile(FSItem item, string newName) { if (!Utility.IsValidPathname(newName)) { return(false); // TODO: throw an exception } // 1. Is newName a folder? // var newParentNode = await FetchNode(newName); // if (newParentNode != null) // { // return await MoveFile(item, newParentNode); // } // 2. Is newName a file in the same dir? var destination = Path.GetDirectoryName(newName); // 2.1 Is destination empty? (means that the file is in the current folder) if (destination == "") { CacheStorage.RemoveItems(item.Dir); // invalidate parent path await amazon.Nodes.Rename(item.Id, newName, item.IsDir); return(true); } // 2.1.1 If destination (destination) node does not exist or is not a directory, we should fail var destinationNode = await FetchNode(destination); if (destinationNode == null || !destinationNode.IsDir) { return(false); // TODO: throw exception } // 2.2 Is destination the same as the directory name of the item? var filename = Path.GetFileName(newName); if (filename == "") { filename = item.Name; } if (destination == item.Dir) { // cannot rename to myself if (filename == item.Name) { return(true); } CacheStorage.RemoveItems(item.Dir); // invalidate parent path await amazon.Nodes.Rename(item.Id, filename, item.IsDir); return(true); } // 3. Is newName is another folder AND filename? (the only remaining option) // Here we have 2 problems (because of no way to move and rename atomically): // 1) If we first rename and then move, then it might happen so that there is a file with the same name in the current folder // 2) Similar problem can be if first move and then rename // Solution? We have it. // 1) We should first rename to something unique (say, filename.randomstr.ext) and most likely we will not get a conflict // 2) We move the file with this unique name // 3) We _try_ to rename back to the original name // 4) If we fail, we add (2), (3), (n) to the filename (i.e.: filename (n).ext) // 5) If we still fail, we at least have the same file with the randomstr in the filename var filenameWithoutExtension = Path.GetFileNameWithoutExtension(filename); var extension = Path.GetExtension(filename); var randomString = Utility.RandomString(8); var tmpFilename = string.Format("{0}.{1}.{2}", filenameWithoutExtension, randomString, extension); // 3.1 Rename to a temporary name await amazon.Nodes.Rename(item.Id, tmpFilename, item.IsDir); // 3.2 Move to the new destination await amazon.Nodes.Move(item.Id, destinationNode.Id, item.IsDir); // 3.3 Rename back to the original name await amazon.Nodes.Rename(item.Id, filename, item.IsDir); // TODO: catch exceptions and try to rename again CacheStorage.RemoveItems(item.Dir); // invalidate parent path CacheStorage.RemoveItems(destinationNode.Path); // invalidate new parent path return(true); }