另辟新径实现 Blazor/MAUI 本机交互(二)

NativeApi.cs

内部部分类,该类提供了几个与文件操作相关的方法。

get_config() 方法:

   public Task<string> get_config()
   {
       printerName = Preferences.Default.Get(PrinterNameKey, printerName);
       return Task.FromResult(printerName);
   }   

open_file_dialog() 方法:

   public async Task<string> open_file_dialog()
   {
       //work in ui thread
       var res =
       await MainThread.InvokeOnMainThreadAsync(async () =>
       {
           try
           {
               var result = await FilePicker.Default.PickAsync(new PickOptions());
               if (result == null)
               {
                   return "";
               }
               using var stream = await result.OpenReadAsync();
               StreamReader reader = new StreamReader(stream);
               return Convert.ToBase64String(Encoding.UTF8.GetBytes(reader.ReadToEnd()));
           }
           catch (Exception e)
           {
               var err = e.Message;
               return err;
           }
       });
       return res;
   }   
  • 该方法在 UI 线程上运行,打开文件选择对话框。
  • 使用 FilePicker.Default.PickAsync 方法打开文件选择器。
  • 如果用户没有选择文件,返回空字符串。
  • 如果选择了文件,读取文件内容并将其转换为 Base64 编码的字符串。
  • 如果发生异常,返回异常消息。

save_file(string data, string fileName) 方法:

   public async Task<string> save_file(string data, string fileName)
   {
       try
       {
           string targetFile = System.IO.Path.Combine(FileSystem.Current.AppDataDirectory, fileName);

           using FileStream outputStream = File.OpenWrite(targetFile);
           using StreamWriter streamWriter = new(outputStream);

           await streamWriter.WriteAsync(data);
           return $"file path:{targetFile.Replace("\\","\\\\")}";
       }
       catch (Exception e)
       {
           var err = e.Message;
           return err;
       }
    }
  • 该方法将给定的数据保存到指定文件名的文件中。
  • 使用 Path.Combine 方法构建目标文件路径,该路径位于应用程序的数据目录中。
  • 使用 File.OpenWrite 方法打开文件流,并使用 StreamWriter 写入数据。
  • 写入完成后,返回文件路径。
  • 如果发生异常,返回异常消息。

这些方法提供了基本的文件操作功能,包括获取配置、打开文件对话框和保存文件

如何在 Preferences 中存储自定义对象?

Maui 基础 - Preferences 存储和检索应用程序的首选项

完整代码

// ********************************** 
// Densen Informatica 中讯科技 
// 作者:Alex Chow
// e-mail:zhouchuanglin@gmail.com 
// **********************************

using System.Text;
using System.Text.Json;

namespace test1;

internal partial class NativeApi : object
{
    /// <summary>
    /// 从应用程序的首选项中获取打印机名称 (printerName)
    /// </summary>
    /// <returns></returns>
    public Task<string> get_config()
    {
        printerName = Preferences.Default.Get(PrinterNameKey, printerName);
        return Task.FromResult(printerName);
    }

    /// <summary>
    /// 打开文件选择对话框,读取文件内容并将其转换为 Base64 编码的字符串返回
    /// </summary>
    /// <returns>文件内容 Base64 编码的字符串</returns>
    public async Task<string> open_file_dialog()
    {
        //work in ui thread
        var res =
        await MainThread.InvokeOnMainThreadAsync(async () =>
        {
            try
            {
                var result = await FilePicker.Default.PickAsync(new PickOptions());
                if (result == null)
                {
                    return "";
                }
                using var stream = await result.OpenReadAsync();
                StreamReader reader = new StreamReader(stream);
                return Convert.ToBase64String(Encoding.UTF8.GetBytes(reader.ReadToEnd()));
            }
            catch (Exception e)
            {
                var err = e.Message;
                return err;
            }
        });
        return res;
    }

    /// <summary>
    /// 将给定的数据保存到指定文件名的文件,返回文件路径
    /// </summary>
    /// <param name="data"></param>
    /// <param name="fileName"></param>
    /// <returns>文件路径</returns>
    public async Task<string> save_file(string data, string fileName)
    {
        try
        {
            string targetFile = System.IO.Path.Combine(FileSystem.Current.AppDataDirectory, fileName);

            using FileStream outputStream = File.OpenWrite(targetFile);
            using StreamWriter streamWriter = new(outputStream);

            await streamWriter.WriteAsync(data);
            return $"file path:{targetFile.Replace("\\", "\\\\")}";
        }
        catch (Exception e)
        {
            var err = e.Message;
            return err;
        }
    }

    /// <summary>
    /// 存储自定义对象 User, 将自定义对象序列化为 string 类型,然后再存储
    /// </summary>
    /// <param name="user"></param>
    public void SaveUser(User user)
    {
        string jsonString = JsonSerializer.Serialize(user);
        Preferences.Set("user", jsonString);
    }

    /// <summary>
    /// 检索自定义对象 User, 从 Preferences 中检索字符串,然后将其反序列化为自定义对象
    /// </summary>
    /// <returns></returns>
    public User? GetUser()
    {
        string jsonString = Preferences.Get("user", string.Empty);
        if (string.IsNullOrEmpty(jsonString))
        {
            return null;
        }
        return JsonSerializer.Deserialize<User>(jsonString);
    }

}

/// <summary>
/// 在 Preferences 中存储自定义对象, https://www.cnblogs.com/densen2014/p/18710319
/// </summary>
public class User
{
    public string? Name { get; set; }
    public int Age { get; set; }
}