スキップしてメイン コンテンツに移動

.NET MAUI 複数のJSONファイルをファイルエクスプローラーでリードして、アプリ内のストレージに保存する

.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ソース

特に難しいことは無くて、ボタンを押されたら
  1. オプションを設定(今回はjsonファイルで絞り込み)
  2. ダイアログオープン
  3. ファイルがあったらアプリのストレージフォルダに「json」 というフォルダを作成
  4. ファイルリード
  5. 整合性チェックのためにjsonのシリアライザーを使う
  6. オッケーだったらさっき作ったフォルダに保存
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に公開しているのでそちらからクローンするなりして下さい
多分他にも似たようなの公開してる人はいっぱい居ると思いますが
 
おしまい

コメント

このブログの人気の投稿

RAM DISKを使ってみた(使ったのはImDisk)

GWだし、まあちょっとラムディスクを入れてみました うちのPCはWindows11 使ったのはImDiskというRAM Disk。 まあ、この辺のインストールとかはあちこちで解説してる人がいるので適当にぐぐってくださいな で、とりあえずベンチマーク なかなかいいスピードだ で、大抵の人はブラウザのキャッシュをRAMディスクにするといいよ・・・と言うけど そもそもメインドライブがNVMeのSSDを使っている状態で、体感速度なんか上がらない(使い終わったキャッシュを再起動したら綺麗さっぱり捨て去ってくれるという利点はある)  うちで一番効果があるのは Adobe Audition というアプリ これが結構高速化する(キャッシュをちゃんとRAMディスクにしたら・・・だけど) ハイレゾ音源だと、1時間の音源が何かする度に4GBのファイルを作られてしまう なので、RAM DISKにすると、結構編集時間を短縮できる Premiere Rushも出力先をRam Diskにしておいて終わったら、SSDにコピーすると言う事をやるとかなりスピードアップになる 実はうちのPCは普段は99%のパワーで動作していて、CPUのターボブーストが掛からないようになっている 大体3.6GHz当たりで安定してるのだけど、これを100%にするとターボブースト機能がONになって一部のコアが4.5とか4.8GHzまで上がる まあ、毎回電源オプションをいじる事になるのだけどさ・・・ そうしてベンチを取ると こんな感じ とは言え、ブーストしてるからと行ってRam Diskのスピードの差を体感する事はさすがに無理 ・・・と言うかフォトショでもRAM DISKにしてよかった・・・と言うほど変わらない SSDの性能が上がってきたしもし次にPCを買い換えたらRAM DISKよりSSDの方が速いかもね  

.NET MAUIでスプラッシュスクリーン Android12で地獄を見る

まずは起動するところから・・・・  スプラッシュスクリーンだぬ マイクロソフトのサイト 見てると簡単そう(実際簡単で細かい事を気にしなければsvgファイルを用意して1行だけ書き換えておしまい)   なんかプロジェクトファイルに自動で記述されるらしい よし、プロジェクト作った                     つーか、もうスプラッシュがあるんだけど・・・・ そして自作のsvgファイル くうっ・・・デザインセンスない・・・・   それはともかく、このSVGファイルを Resources\Images にドラッグ&ドラッグ プロジェクトを右クリックして「プロジェクトファイルの編集」 して、編集できるようになったプロジェクトファイルを 自分のプロジェクトファイルに書き換える <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="168,168" /> ↓ <MauiSplashScreen Include="Resources\Splash\ splashtestmaui .svg" Color="#512BD4" BaseSize="168,168" />   とりあえずAndroidで実行 お、おう・・・・ まあ最初はこんなもんよね 最初に紹介したマイクロソフトのサイトでもBaseSizeを書き換えてくださいって言ってるし 言われたとおりに <MauiSplashScreen Include="Resources\Splash\splashtestmaui.svg" Color="#512BD4" BaseSize=" 320,600 " /> 書き換えてみると いい感じじゃーん じゃあアンドロイドのバージョン毎に試してみよう   Android 7 Android 11 Android 12 Android 13 ...

.NET MAUI BLE(Bluetooth Low Energy)も上手く行った

2023/10/11更新 ↓こちらの記事で更新しれました。 .NET MAUI PLUGIN BLEがWindows(10/11)に対応してた Windows対応 イヤッッホォォォオオォオウ Bluetooth LE plugin for Xamarin &amp; MAUI がWindowsに対応してた~ nugetでver3.00をみんな早速ゲットだ。   ちなみにこちらはAndroid版のサンプルアプリ   GitHub...   [ブログカード風リンクタグ作成] ------------------------------------------------------------------------------ 昔、スマホとESP32の接続確認用に作ったプログラムをXamarinからMAUIに移植したら動いちゃった   まあ、ESP32からスマホへの一方通行なアプリなんだけど 面倒くさいので github に公開した 下手くそなコード書きやがってとか思われそう 「間違ってるぞこのやろう」というのを見つけたら教えてくれると嬉しいです 要素技術の調査はこれで完了かな