public void TestRename() { using var flagFile = new TemporaryFile("0install-unit-tests"); File.WriteAllText(flagFile, "/dir/file1\n/dir/file2\n/dir2/file\n"); FlagUtils.Rename(flagFile, "dir", "new_dir"); File.ReadAllText(flagFile).Should().Be("/new_dir/file1\n/new_dir/file2\n/dir2/file\n"); }
/// <summary> /// Applies a <see cref="RenameStep"/> to a <see cref="TemporaryDirectory"/>. /// </summary> /// <param name="step">The <see cref="RenameStep"/> to apply.</param> /// <param name="workingDir">The <see cref="TemporaryDirectory"/> to apply the changes to.</param> /// <exception cref="IOException">A path specified in <paramref name="step"/> is illegal.</exception> public static void Apply(this RenameStep step, TemporaryDirectory workingDir) { #region Sanity checks if (step == null) { throw new ArgumentNullException(nameof(step)); } if (workingDir == null) { throw new ArgumentNullException(nameof(workingDir)); } #endregion if (string.IsNullOrEmpty(step.Source)) { throw new IOException(string.Format(Resources.RecipeInvalidPath, "(empty)")); } if (string.IsNullOrEmpty(step.Destination)) { throw new IOException(string.Format(Resources.RecipeInvalidPath, "(empty)")); } string source = FileUtils.UnifySlashes(step.Source); string destination = FileUtils.UnifySlashes(step.Destination); if (FileUtils.IsBreakoutPath(source)) { throw new IOException(string.Format(Resources.RecipeInvalidPath, source)); } if (FileUtils.IsBreakoutPath(destination)) { throw new IOException(string.Format(Resources.RecipeInvalidPath, destination)); } string sourcePath = Path.Combine(workingDir, source); string destinationPath = Path.Combine(workingDir, destination); string parentDir = Path.GetDirectoryName(destinationPath); if (!string.IsNullOrEmpty(parentDir) && !Directory.Exists(parentDir)) { Directory.CreateDirectory(parentDir); } if (Directory.Exists(sourcePath)) { Directory.Move(sourcePath, destinationPath); } else { File.Move(sourcePath, destinationPath); } // Update in flag files as well FlagUtils.Rename(Path.Combine(workingDir, FlagUtils.XbitFile), source, destination); FlagUtils.Rename(Path.Combine(workingDir, FlagUtils.SymlinkFile), source, destination); }