.NET MAUIではエクスプローラーではなく、FilePickerだった
そうなのです。なので、まずはFilePickerを使わなければ話にならない
そして関わるのがことごとく非同期関数なので、try~catchでエラー処理しないと漏れが発生する
xaml側
とりあえず釦を一個だけ画面に貼り付ける
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiTestFile.MainPage">
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Button x:Name="FileSelectBtn" Clicked="OnFileSelectBtnClicked"
Text="JSONファイルを選んでね"
BackgroundColor="SandyBrown" TextColor="Green"/>
</VerticalStackLayout>
</ScrollView>
</ContentPage>
色とかは適当にして下さい
csソース
特に難しいことは無くて、ボタンを押されたら
- オプションを設定(今回はjsonファイルで絞り込み)
- ダイアログオープン
- ファイルがあったらアプリのストレージフォルダに「json」 というフォルダを作成
- ファイルリード
- 整合性チェックのためにjsonのシリアライザーを使う
- オッケーだったらさっき作ったフォルダに保存
namespace MauiTestFile
{
//! @todo FilePickerの参考サイト
//! https://learn.microsoft.com/ja-jp/dotnet/maui/platform-integration/storage/file-picker?view=net-maui-8.0&tabs=android
public partial class MainPage : ContentPage
{
/// <summary>
/// コンストラクタ
/// </summary>
public MainPage()
{
InitializeComponent();
}
/// <summary>
/// ファイル選択ボタンがクリックされたときの処理
/// </summary>
/// <param name="sender">送信元</param>
/// <param name="e">イベント情報</param>
private async void OnFileSelectBtnClicked(object sender, EventArgs e)
{
try
{
// ファイル選択ダイアログのオプションを設定
var customFileType = new FilePickerFileType(
new Dictionary<DevicePlatform, IEnumerable<string>>
{
{ DevicePlatform.iOS, new[] { "json" } }, // iOS UTType を使うらしい(iPhone持ってないので未検証)
{ DevicePlatform.Android, new[] { "application/json" } }, // Android MIME type
{ DevicePlatform.WinUI, new[] { ".json", ".json" } }, // Windows 拡張子
{ DevicePlatform.macOS, new[] { "public.json" } }, // macOS UTType(MAC持ってないので未検証)
{ DevicePlatform.Tizen, new[] { "application/json" } }, // Tizen MIME type・・・使ってる人いるの?
});
PickOptions options = new()
{
PickerTitle = "JSONファイルを選択してください",
FileTypes = customFileType,
};
// ファイル選択ダイアログを表示
//var result = await FilePicker.Default.PickAsync(options);
// 複数ファイル選択ダイアログを表示
var results = await FilePicker.Default.PickMultipleAsync(options);
if (results != null && results.Any())
{
// "json" フォルダを作成
string jsonFolderPath = Path.Combine(FileSystem.AppDataDirectory, "json");
Directory.CreateDirectory(jsonFolderPath);
foreach (var file in results)
{
try
{
// ファイルの内容を読み取る
string fileContent = await File.ReadAllTextAsync(file.FullPath);
// JSON をパースして整合性チェック
var jsonObject = System.Text.Json.JsonSerializer.Deserialize<object>(fileContent);
// ファイル名を保持して保存
string localFilePath = Path.Combine(jsonFolderPath, file.FileName);
await File.WriteAllTextAsync(localFilePath, fileContent);
}
catch (Exception jsonEx)
{
// JSON の解析エラーを通知
await DisplayAlert("JSON エラー", $"ファイル {file.FileName} の解析中にエラーが発生しました: {jsonEx.Message}", "OK");
}
}
// 保存完了メッセージを表示
await DisplayAlert("保存完了", $"選択されたファイルが保存されました: {jsonFolderPath}", "OK");
}
else
{
// ファイルが選択されなかった場合
await DisplayAlert("ファイル選択", "ファイルが選択されませんでした。", "OK");
}
}
catch (Exception ex)
{
// エラー処理
await DisplayAlert("エラー", $"エラーが発生しました: {ex.Message}", "OK");
}
}
}
}
こんな感じで作ったらファイルを保存できるようになります
Windows/Androidで試しましたが、特に問題はなし。
ファイルの複数選択も出来ます(複数選択したくなかったら、PickMultipleAsync()ではなく、PickAsync()にする)
iOSやMacでもきっと上手く行く。Tizen?・・知らんわそんなもん
自分でちょこまか書くのは嫌だって人は
githubに公開しているのでそちらからクローンするなりして下さい
多分他にも似たようなの公開してる人はいっぱい居ると思いますが
おしまい
コメント
コメントを投稿