using System; using System.IO; using Microsoft.Win32; using PCL.Core.App.Localization; using PCL.Core.Logging; namespace PCL.Core.UI; /// /// 提供文件和文件夹对话框相关的实用方法。 /// public static class SystemDialogs { /// /// 显示保存文件对话框,要求用户选择保存位置。 /// /// 对话框标题。为 null 时使用本地化的默认标题。 /// 默认文件名。 /// 文件格式过滤器,例如 "常用图片文件|*.png;*.jpg"。为 null 时使用本地化的全部文件筛选器。 /// 初始目录,默认为 null。 /// 用户选择的完整文件路径,如果取消则返回空字符串。 public static string SelectSaveFile( string? title, string fileName, string? fileFilter = null, string? initialDirectory = null) { var dialogTitle = title ?? Lang.Text("SystemDialog.File.SelectTitle"); var dialogFilter = fileFilter ?? Lang.Text("SystemDialog.File.AllFilesFilter"); var fileDialog = new SaveFileDialog { AddExtension = true, Title = dialogTitle, FileName = fileName, Filter = dialogFilter, InitialDirectory = !string.IsNullOrEmpty(initialDirectory) && Directory.Exists(initialDirectory) ? initialDirectory : null }; LogWrapper.Info("Dialog", $"打开保存文件对话框:{dialogTitle}"); var result = fileDialog.ShowDialog(); if (result != true) { LogWrapper.Info("Dialog", "选择文件被取消"); return ""; } var selectedPath = fileDialog.FileName; LogWrapper.Info("Dialog", $"选择文件返回:{selectedPath}"); return string.IsNullOrEmpty(selectedPath) ? "" : Path.GetFullPath(selectedPath); } /// /// 显示打开文件对话框,要求用户选择单个文件。 /// /// 文件格式过滤器,例如 常用图片文件|*.png;*.jpg。为 null 时使用本地化的全部文件筛选器。 /// 对话框标题。为 null 时使用本地化的默认标题。 /// 初始目录,默认由系统决定。 /// 用户选择的完整文件路径,如果取消则返回空字符串。 public static string SelectFile( string? fileFilter = null, string? title = null, string? initialDirectory = null) { var result = SelectFiles(fileFilter, title, initialDirectory, false); return result.Length == 0 ? "" : result[0]; } /// /// 显示打开文件对话框,要求用户选择文件。 /// /// 文件格式过滤器,例如 常用图片文件|*.png;*.jpg。为 null 时使用本地化的全部文件筛选器。 /// 对话框标题。为 null 时使用本地化的默认标题。 /// 初始目录,默认由系统决定。 /// 是否允许选择多个文件,默认允许。 /// 用户选择的文件路径数组,如果取消则返回空数组。 public static string[] SelectFiles( string? fileFilter = null, string? title = null, string? initialDirectory = null, bool allowMultiSelect = true) { var dialogTitle = title ?? Lang.Text("SystemDialog.File.SelectTitle"); var dialogFilter = fileFilter ?? Lang.Text("SystemDialog.File.AllFilesFilter"); var fileDialog = new OpenFileDialog { AddExtension = true, CheckFileExists = true, Filter = dialogFilter, Multiselect = allowMultiSelect, Title = dialogTitle, ValidateNames = true, InitialDirectory = !string.IsNullOrEmpty(initialDirectory) && Directory.Exists(initialDirectory) ? initialDirectory : null }; var num = allowMultiSelect ? "多" : "单"; LogWrapper.Info("Dialog", $"打开选择{num}个文件对话框: {dialogTitle}"); var result = fileDialog.ShowDialog(); if (result != true) { LogWrapper.Info("Dialog", "选择文件被取消"); return []; } string[] selectedFiles = fileDialog.FileNames; LogWrapper.Info("Dialog", $"选择{num}个文件返回: {string.Join(",", selectedFiles)}"); return selectedFiles.Length == 0 ? [] : Array.ConvertAll(selectedFiles, Path.GetFullPath); } /// /// 显示文件夹选择对话框,要求用户选择一个文件夹。 /// /// 对话框标题。为 null 时使用本地化的默认标题。 /// 初始目录,默认为桌面。 /// 用户选择的文件夹路径(以 \ 结尾),如果取消则返回空字符串。 public static string SelectFolder(string? title = null, string? initialDirectory = null) { var dialogTitle = title ?? Lang.Text("SystemDialog.Folder.SelectTitle"); var folderDialog = new OpenFolderDialog { Title = dialogTitle, InitialDirectory = initialDirectory ?? Environment.GetFolderPath(Environment.SpecialFolder.Desktop), Multiselect = false }; LogWrapper.Info("Dialog", $"打开选择文件夹对话框: {dialogTitle}"); var result = folderDialog.ShowDialog(); if (result != true) { LogWrapper.Info("Dialog", "选择文件夹被取消"); return ""; } var selectedPath = folderDialog.FolderName; if (string.IsNullOrEmpty(selectedPath)) { LogWrapper.Info("Dialog", "选择文件夹返回: 空"); return ""; } var normalizedPath = Path.GetFullPath(selectedPath).TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar; LogWrapper.Info("Dialog", $"选择文件夹返回: {normalizedPath}"); return normalizedPath; } }