public FileElementViewModel(FileElementModel fileElementModel) { _fileElementModel = fileElementModel; IsCopy = _fileElementModel.FileActions.HasFlag(FileActions.Copy); IsDelete = _fileElementModel.FileActions.HasFlag(FileActions.Delete); FileName = _fileElementModel.Path; }
/// <summary> /// Сравнение списков файлов. /// </summary> public IList <FileElementModel> CompairFolders(string oldFolder, string newFolder) { var sourceFiles = GetFileList(oldFolder); var targetFiles = GetFileList(newFolder); var result = new List <FileElementModel>(); foreach (var sourceFile in sourceFiles) { var s = sourceFile.Path.Replace(oldFolder, string.Empty); if (!targetFiles.Any(x => x.Path.EndsWith(s))) { var fileElementModel = new FileElementModel(); fileElementModel.Path = s; result.Add(fileElementModel); } } return(result); }
/// <summary> /// ModelをもとにViewModelを作成 /// </summary> public FileElementViewModel(FileElementModel pathModel) { this.pathModel = pathModel; this.Diff = pathModel .ObserveProperty(x => x.OutputFileName) .Select(x => CreateDiff()) .ToReadOnlyReactivePropertySlim(); this.IsReplaced = pathModel .ObserveProperty(x => x.IsReplaced) .ToReadOnlyReactivePropertySlim(); this.IsConflicted = pathModel .ObserveProperty(x => x.IsConflicted) .ToReadOnlyReactivePropertySlim(); OpenInExploreCommand.Subscribe(x => Process.Start("EXPLORER.EXE", @$ "/select," "{pathModel.InputFilePath}" "")); }
/// <summary> /// Загзурить файлы из папки и подпапок. /// </summary> private List <FileElementModel> GetFileList(string folderPath) { if (string.IsNullOrEmpty(folderPath)) { return(new List <FileElementModel>()); } bool IsFilltered(string fileName) { var result = true; if (_isUseFillter) { result = _audioFilesFormat.Any(fileName.EndsWith); } if (_isUseIgnoreFillter) { result |= _ignoreFilesFormat.Any(fileName.EndsWith); } return(result); } var folders = Directory.GetDirectories(folderPath); var files = Directory.GetFiles(folderPath).Where(IsFilltered).ToList(); var ls = new List <FileElementModel>(); foreach (var file in files) { var item = new FileElementModel(); item.Path = file; ls.Add(item); } foreach (var folder in folders) { ls.AddRange(GetFileList(folder)); } return(ls); }
public static void RemoveFlags(this FileElementModel model, FileActions removed) { model.FileActions = model.FileActions &= ~removed; }
public static void AddFlags(this FileElementModel model, FileActions added) { model.FileActions = model.FileActions |= added; }
internal void Test_FileElementCore(string targetFileName, IReadOnlyList <string> regexPatterns, IReadOnlyList <string> replaceTexts, string expectedRenamedFileName, bool isRenameExt) { string targetFilePath = @"D:\FileRenamerDiff_Test\" + targetFileName; var fileSystem = new MockFileSystem(new Dictionary <string, MockFileData>() { [targetFilePath] = new MockFileData(targetFilePath) }); var fileElem = new FileElementModel(fileSystem, targetFilePath); var queuePropertyChanged = new Queue <string?>(); fileElem.PropertyChanged += (o, e) => queuePropertyChanged.Enqueue(e.PropertyName); //TEST1 初期状態 fileElem.OutputFileName .Should().Be(targetFileName, "まだ元のファイル名のまま"); fileElem.IsReplaced .Should().BeFalse("まだリネーム変更されていないはず"); fileElem.State .Should().Be(RenameState.None, "まだリネーム保存していない"); queuePropertyChanged .Should().BeEmpty("まだ通知は来ていないはず"); //TEST2 Replace //ファイル名の一部を変更する置換パターンを作成 var replaceRegexes = Enumerable .Zip(regexPatterns, replaceTexts, (regex, replaceText) => new ReplaceRegex(new Regex(regex, RegexOptions.Compiled), replaceText)) .ToArray(); //リネームプレビュー実行 fileElem.Replace(replaceRegexes, isRenameExt); fileElem.OutputFileName .Should().Be(expectedRenamedFileName, "リネーム変更後のファイル名になったはず"); bool shouldRename = targetFileName != expectedRenamedFileName; fileElem.IsReplaced .Should().Be(shouldRename, "リネーム後の名前と前の名前が違うなら、リネーム変更されたはず"); if (shouldRename) { queuePropertyChanged .Should().Contain(new[] { nameof(FileElementModel.OutputFileName), nameof(FileElementModel.OutputFilePath), nameof(FileElementModel.IsReplaced) }); } else { queuePropertyChanged .Should().BeEmpty(); } fileElem.State .Should().Be(RenameState.None, "リネーム変更はしたが、まだリネーム保存していない"); fileSystem.Directory.GetFiles(Path.GetDirectoryName(targetFilePath)) .Select(p => Path.GetFileName(p)) .Should().BeEquivalentTo(new[] { targetFileName }, "ファイルシステム上はまだ前の名前のはず"); //TEST3 Rename fileElem.Rename(); fileElem.State .Should().Be(RenameState.Renamed, "リネーム保存されたはず"); fileElem.InputFileName .Should().Be(expectedRenamedFileName, "リネーム保存後のファイル名になったはず"); fileSystem.Directory.GetFiles(Path.GetDirectoryName(targetFilePath)) .Select(p => Path.GetFileName(p)) .Should().BeEquivalentTo(new[] { expectedRenamedFileName }, "ファイルシステム上も名前が変わったはず"); }