public AutoRenameTask(List <VpkHolder> list, AutoRenameConfig cfg, string gameDir, AddonsListTxt listTxt) : base("自动重命名") { this.list = list; this.cfg = cfg; this.gameDir = gameDir; this.listTxt = listTxt; CancelPromptText = "要中止操作吗?部分重命名可能已经进行,此时中止并不会撤销已发生的更改。"; MaxProgress = 10;// list.Count; Text = "请稍等..."; }
private void DoRename_FileNameToInternalName(VpkHolder item, AutoRenameConfig cfg) { }
private void DoRename_InternalNameToFileName(VpkHolder item, AutoRenameConfig cfg) { string name; // Skip workshop items by default. if (item.vpkDir == VpkHolder.VpkDirType.WorkShopDir) { return; } // Retrieve old file name. string oldFn = Path.GetFileNameWithoutExtension(item.FileInf.Name); // Skip items having "those" prefises and suffises, or not. if (cfg.ItfSkipIfFnHasThosePrefises && (oldFn.StartsWith(CommonConsts.RenameMapPrefix) || oldFn.StartsWith(CommonConsts.RenameModPrefix) || doRename_endWithUnderlineAndNumbersRegex.IsMatch(oldFn))) { return; } // Skip items having Chinese/Japanese/Korean characters in their file names, or not. if (cfg.ItfSkipIfFnContainsCjk && LocalizationUtil.HasCjkCharacter(oldFn)) { return; } // Attempt to read display name in the order defines by user. switch (cfg.ItfMySourcePreference) { case AutoRenameConfig.ItfSourcePreference.Addon: name = item.AddonTitle; if (DoRename_IsInvalidName(name)) { name = item.MissionTitle; } break; case AutoRenameConfig.ItfSourcePreference.Mission: name = item.MissionTitle; if (DoRename_IsInvalidName(name)) { name = item.AddonTitle; } break; default: return; } // Skip if both approaches to read these names have failed. if (DoRename_IsInvalidName(name)) { return; } // Replace invalid characters for file names and format string (it does not matter, right). foreach (char ch in Path.GetInvalidFileNameChars()) { name = name.Replace(ch, '_'); } name = name.Replace('{', '(').Replace('}', ')'); // Add prefises, or not. if (cfg.ItfFnAddMapOrModPrefix) { name = item.HasMission ? CommonConsts.RenameMapPrefix + name : CommonConsts.RenameModPrefix + name; } // We will be adding numbers in case of name conflicts, e.g. xxx (1).vpk, xxx (3)_2333.vpk. string counterPattern; // For numeric file names we keep it as suffix (and counter num in the middle), or not. if (cfg.ItfKeepAsSuffixForNumericalFn && doRename_NumbersRegex.IsMatch(oldFn)) { name = name + "{0}" + '_' + oldFn; counterPattern = "({0})"; } else { name += "{0}"; counterPattern = " ({0})"; } name += ".vpk"; // Perform the actual rename. name = DoRename_MoveWithoutConflicts(item.FileInf, name, counterPattern); oldFn += ".vpk"; // Anything changed. if (oldFn != string.Format(name, string.Empty)) { item.UpdateFileName(); // Preserve disabled state. Enabled is default. if (item.vpkDir == VpkHolder.VpkDirType.AddonsDir && !item.IsEnabled) { listTxt?.ToggleAddonEnabledState(name, false); // Actually not good practice. listTxt?.RemoveAddonEnabledState(oldFn); } Debug.WriteLine(string.Format("Renamed {0} to {1}", oldFn, name)); } }