.net开发安卓入门-文件操作与配置操作

news2024/11/29 22:46:44

.net开发安卓入门-文件操作与配置操作

  • 文件操作
    • 内部存储
      • 代码
      • 运行效果
      • System.Environment.SpecialFolder枚举类型对应路径表格
    • 外部存储(代码和效果见上图)
    • 区别
  • 缓存SharedPreferences
    • 获取SharedPreferences对象
    • 方法列表
    • 读取配置信息
    • 写配置信息
  • Assets
  • Nlog配置

文件操作

内部存储

使用System.Environment.GetFolderPath方法获取路径

代码

 protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

            var txt = FindViewById<TextView>(Resource.Id.txt);
            txt.Append($"ApplicationData:{System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData)} \r\n");
            txt.Append($"LocalApplicationData:{System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData)} \r\n");

            txt.Append($"MyDocuments:{System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments)} \r\n");

            using (var writer = File.CreateText(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments) + "/MyDocuments.txt"))
            {
                writer.WriteLineAsync("MyDocuments").Wait();
            }

            txt.Append($"Personal:{System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)} \r\n");

            txt.Append($"CommonApplicationData:{System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData)} \r\n");

 
            txt.Append($"CacheDir:{this.ApplicationContext.CacheDir.AbsolutePath} \r\n");
            using (var writer = File.CreateText(this.ApplicationContext.CacheDir.AbsolutePath+"/cache.txt"))
            {
                  writer.WriteLineAsync("cache").Wait();
            }
            txt.Append($"DataDir:{this.ApplicationContext.DataDir.AbsolutePath} \r\n");

            using (var writer = File.CreateText(this.ApplicationContext.DataDir.AbsolutePath + "/data.txt"))
            {
                writer.WriteLineAsync("data").Wait();
            }

            txt.Append("data文件内容:" + File.ReadAllText(this.ApplicationContext.DataDir.AbsolutePath + "/data.txt"));

            txt.Append($" ---------------------------------------------\r\n");

            txt.Append($"扩展存储操作\r\n");
            txt.Append($"ExternalStorageDirectory:{Android.OS.Environment.ExternalStorageDirectory} \r\n");

            txt.Append($"AbsolutePath:{Environment.DataDirectory.AbsolutePath} \r\n");
            txt.Append($"root:{this.ApplicationContext.GetExternalFilesDir("root")} \r\n");
            txt.Append($"null:{this.ApplicationContext.GetExternalFilesDir(null)} \r\n");

            txt.Append($"cache:{string.Join(" , " ,this.ApplicationContext.GetExternalCacheDirs().Select(t=>t.AbsolutePath))} \r\n");
        }

运行效果

在这里插入图片描述

System.Environment.SpecialFolder枚举类型对应路径表格

在这里插入图片描述

外部存储(代码和效果见上图)

外部存储主要使用this.ApplicationContext.GetExternalFilesDir方法

区别

  1. 外部存储分为专用和公用,专用存储会随着app卸载而删除
  2. 在没有root的情况,通过安卓系统的文件管理功能,是无法查看内部存储的,外部存储在文件–>Android–>data–>“APP名称”

缓存SharedPreferences

SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置,它提供了String,set,int,long,float,boolean六种数据类型。SharedPreferences的数据以键值对的进行保存在以xml形式的文件中。在应用中通常做一些简单数据的持久化缓存。

获取SharedPreferences对象

在Activity中 GetSharedPreferences(“一个名字”, FileCreationMode.Private);获取sp对象

方法列表


using System;
using System.Collections.Generic;
using Android.Runtime;
using Java.Interop;

namespace Android.Content
{
    //
    // 摘要:
    //     Interface for accessing and modifying preference data returned by Context#getSharedPreferences.
    //
    // 言论:
    //     Java documentation for
    //     android.content.SharedPreferences
    //     .
    //     Portions of this page are modifications based on work created and shared by the
    //     Android Open Source Project and used according to terms described in the Creative
    //     Commons 2.5 Attribution License.
    [Register("android/content/SharedPreferences", "", "Android.Content.ISharedPreferencesInvoker")]
    public interface ISharedPreferences : IJavaObject, IDisposable, IJavaPeerable
    {
        //
        // 摘要:
        //     Retrieve all values from the preferences.
        //
        // 值:
        //     To be added.
        //
        // 异常:
        //   T:Java.Lang.NullPointerException:
        //
        // 言论:
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        IDictionary<string, object>? All
        {
            [Register("getAll", "()Ljava/util/Map;", "GetGetAllHandler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
            get;
        }

        //
        // 摘要:
        //     Checks whether the preferences contains a preference.
        //
        // 参数:
        //   key:
        //     The name of the preference to check.
        //
        // 返回结果:
        //     Returns true if the preference exists in the preferences, otherwise false.
        //
        // 言论:
        //     Java documentation for
        //     android.content.SharedPreferences.contains(java.lang.String)
        //     .
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("contains", "(Ljava/lang/String;)Z", "GetContains_Ljava_lang_String_Handler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        bool Contains(string? key);

        //
        // 摘要:
        //     Create a new Editor for these preferences, through which you can make modifications
        //     to the data in the preferences and atomically commit those changes back to the
        //     SharedPreferences object.
        //
        // 返回结果:
        //     Returns a new instance of the Editor interface, allowing you to modify the values
        //     in this SharedPreferences object.
        //
        // 言论:
        //     Java documentation for
        //     android.content.SharedPreferences.edit()
        //     .
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("edit", "()Landroid/content/SharedPreferences$Editor;", "GetEditHandler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        ISharedPreferencesEditor? Edit();

        //
        // 摘要:
        //     Retrieve a boolean value from the preferences.
        //
        // 参数:
        //   key:
        //     The name of the preference to retrieve.
        //
        //   defValue:
        //     Value to return if this preference does not exist.
        //
        // 返回结果:
        //     To be added.
        //
        // 异常:
        //   T:Java.Lang.ClassCastException:
        //
        // 言论:
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("getBoolean", "(Ljava/lang/String;Z)Z", "GetGetBoolean_Ljava_lang_String_ZHandler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        bool GetBoolean(string? key, bool defValue);

        //
        // 摘要:
        //     Retrieve a float value from the preferences.
        //
        // 参数:
        //   key:
        //     The name of the preference to retrieve.
        //
        //   defValue:
        //     Value to return if this preference does not exist.
        //
        // 返回结果:
        //     To be added.
        //
        // 异常:
        //   T:Java.Lang.ClassCastException:
        //
        // 言论:
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("getFloat", "(Ljava/lang/String;F)F", "GetGetFloat_Ljava_lang_String_FHandler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        float GetFloat(string? key, float defValue);

        //
        // 摘要:
        //     Retrieve an int value from the preferences.
        //
        // 参数:
        //   key:
        //     The name of the preference to retrieve.
        //
        //   defValue:
        //     Value to return if this preference does not exist.
        //
        // 返回结果:
        //     To be added.
        //
        // 异常:
        //   T:Java.Lang.ClassCastException:
        //
        // 言论:
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("getInt", "(Ljava/lang/String;I)I", "GetGetInt_Ljava_lang_String_IHandler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        int GetInt(string? key, int defValue);

        //
        // 摘要:
        //     Retrieve a long value from the preferences.
        //
        // 参数:
        //   key:
        //     The name of the preference to retrieve.
        //
        //   defValue:
        //     Value to return if this preference does not exist.
        //
        // 返回结果:
        //     To be added.
        //
        // 异常:
        //   T:Java.Lang.ClassCastException:
        //
        // 言论:
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("getLong", "(Ljava/lang/String;J)J", "GetGetLong_Ljava_lang_String_JHandler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        long GetLong(string? key, long defValue);

        //
        // 摘要:
        //     Retrieve a String value from the preferences.
        //
        // 参数:
        //   key:
        //     The name of the preference to retrieve.
        //
        //   defValue:
        //     Value to return if this preference does not exist.
        //
        // 返回结果:
        //     To be added.
        //
        // 异常:
        //   T:Java.Lang.ClassCastException:
        //
        // 言论:
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("getString", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", "GetGetString_Ljava_lang_String_Ljava_lang_String_Handler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        string? GetString(string? key, string? defValue);

        //
        // 摘要:
        //     To be added.
        //
        // 参数:
        //   key:
        //     To be added.
        //
        //   defValues:
        //     To be added.
        //
        // 返回结果:
        //     To be added.
        //
        // 言论:
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("getStringSet", "(Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set;", "GetGetStringSet_Ljava_lang_String_Ljava_util_Set_Handler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        ICollection<string>? GetStringSet(string? key, ICollection<string>? defValues);

        //
        // 摘要:
        //     Registers a callback to be invoked when a change happens to a preference.
        //
        // 参数:
        //   listener:
        //     The callback that will run.
        //
        // 言论:
        //     Java documentation for
        //     android.content.SharedPreferences.registerOnSharedPreferenceChangeListener(android.content.OnSharedPreferenceChangeListener)
        //     .
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("registerOnSharedPreferenceChangeListener", "(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V", "GetRegisterOnSharedPreferenceChangeListener_Landroid_content_SharedPreferences_OnSharedPreferenceChangeListener_Handler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        void RegisterOnSharedPreferenceChangeListener(ISharedPreferencesOnSharedPreferenceChangeListener? listener);

        //
        // 摘要:
        //     Unregisters a previous callback.
        //
        // 参数:
        //   listener:
        //     The callback that should be unregistered.
        //
        // 言论:
        //     Java documentation for
        //     android.content.SharedPreferences.unregisterOnSharedPreferenceChangeListener(android.content.OnSharedPreferenceChangeListener)
        //     .
        //     Portions of this page are modifications based on work created and shared by the
        //     Android Open Source Project and used according to terms described in the Creative
        //     Commons 2.5 Attribution License.
        [Register("unregisterOnSharedPreferenceChangeListener", "(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V", "GetUnregisterOnSharedPreferenceChangeListener_Landroid_content_SharedPreferences_OnSharedPreferenceChangeListener_Handler:Android.Content.ISharedPreferencesInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
        void UnregisterOnSharedPreferenceChangeListener(ISharedPreferencesOnSharedPreferenceChangeListener? listener);
    }
}

读取配置信息

 var sp = GetSharedPreferences(Resource.String.app_name.ToString(), FileCreationMode.Private);
           
Common.HostUrl = sp.GetString("Host", null);
Common.CarNum= sp.GetString("CarNumber", "999"); 

写配置信息

  var sp = GetSharedPreferences(Resource.String.app_name.ToString(), FileCreationMode.Private);
  sp.Edit().PutString("CarNumber", Common.CarNum).Commit();

Assets

如果程序中有一些固定的配置文件,例如NLog中的nlog.config,或者一些不需要写入的才可以,因为Assets是只能读,不能写的。

Nlog配置

在Assets文件夹中添加nlog.config文件,在属性中将Build Action设置为AndroidAsset

var steam = Assets.Open("nlog.config");
var xmlReader = System.Xml.XmlReader.Create(steam);
NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(xmlReader, null);

Xamarin Android
⚠️ NLog v5 will no longer scan the assets folder for NLog.config. Instead consider using Xamarin Assembly Resource

*With NLog v4 then the NLog.dll built for Xamarin Android would automatically scan the assets folder for NLog.config.
If the file name is different, then NLog v4 also supported this:
LogManager.Configuration = new XmlLoggingConfiguration(“assets/someothername.config”);
If using the NLog.dll built for NetStandard in Xamarin, then the Android assets-folder is not recognized or scanned. Instead consider using Assembly Resource.
To explicly read file from Android Assets, then one can do this:
AssetManager assets = this.Assets;

var assetStream = assets.Open("NLog.config");
var xmlReader = System.Xml.XmlReader.Create(assetStream);
NLog.LogManager.Configuration = new XmlLoggingConfiguration(xmlReader, null);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux项目自动化构建工具 make/Makefile】

目录 1 背景 2 原理 3 Linux第一个小程序&#xff0d;进度条 3.1 行缓冲区概念 3.2 进度条代码 4 总结 1 背景 在VS中我们知道当我们想要运行程序时直接按f5程序就会自动运行起来&#xff0c;但是在Linux中如果有多个文件好像并不能这样快速进行&#xff0c;那么这时候就…

远程接入(远程办公)解决方案 OpenText™ Exceed™ TurboX (ETX)

OpenText™ Exceed™ TurboX 安全快速的虚拟应用程序和桌面解决方案&#xff0c;适用于混合工作环境&#xff0c;只需低带宽互联网连接即可为办公桌面和图形要求苛刻的软件提供卓越的用户体验。 突出优势&#xff1a; 支持混合云环境使用任何设备随时随地远程工作为用户提供类…

SpringCloud之Zuul路由网关

Zuul路由网关1. Zuul的概念2. Zuul的作用3. 案例1. Zuul的概念 Zuul包含了对请求的路由&#xff08;用来跳转的&#xff09;和过滤两个最主要功能&#xff1a; 其中路由功能负责将外部请求转发到具体的微服务实例上&#xff0c;是实现外部访问统一入口的基础&#xff0c;而过滤…

新年新故事 | Nice 兔 Meet U

各位伙伴新年好哇 比特熊又回来啦【比特熊故事汇2.0】23年开年第一场与大家一起认识“印象中”的不寻常开发人产品创新实践、工作 Mix 生活、反差感2023年1月12日19:00-20:00【比特熊故事汇2.0】新年想见你第一面Nice 兔 Meet U 比特熊兔年特别限定手办2023年兔年来到&#xff…

Ubuntu10.04编译libevent记录

目前有一个旧的程序 基于很老的ubuntu1004的系统做开发 很多新的C11什么的都用不了 之前 很多在ubuntu1804 上编译的so库 直接拿到1004上来用 提示报错 如下 没办法 只能重新在ubuntu 1004 上面编译了 记录下 下载libevent之后解压 直接执行./configure 提示报错如下图 …

kettle简单的ETL抽取同步两个库之间的数据

kettle下载安装 kettle下载&#xff0c;提取码为 1qyd 安装后&#xff0c;把连接数据库需要的jar包放到 data-integration\lib 目录下&#xff0c;到时候kettle才能正确连接数据库。 sqlserver需要的jar包&#xff0c;提取码为 6a6qmysql需要的jar包&#xff0c;提取码为 n8…

深入理解CAS

目录深入理解CASCAS中的引入什么是CAS&#xff1f;CAS原理——Unsafe类CAS优点CAS缺点ABA问题解决ABA问题深入理解CAS CAS中的引入 我们知道我们使用Volatile可以保证可见性&#xff0c;但不保证原子性&#xff0c;那么&#xff0c;如果我们不使用Lock锁和synchronized&#x…

机器学习之XGBoost模型学习

1.划分数据集函数train_test_split以及数据的加载&#xff1a; python机器学习 train_test_split()函数用法解析及示例 划分训练集和测试集 以鸢尾数据为例 入门级讲解_侯小啾的博客-CSDN博客_train_test_split 还有这篇文章&#xff0c;解析的清除&#xff1a; https://com…

2022 年度中国时序数据应用创新奖公布,涉及工业互联网、车联网等多个行业

随着新兴技术的快速发展&#xff0c;越来越多的企业开始以技术的融合创新来推动业务的数字化智能化转型&#xff0c;其中也诞生了很多成功的应用实践案例。2023 年 1 月 9 日&#xff0c;北京涛思数据科技有限公司(TAOS Data) 正式公布「2022 年度中国时序数据应用创新奖」获奖…

【路径规划】基于D星算法实现栅格地图机器人路径规划

目录算法介绍栅格地图代码运行效果算法介绍 A* 在静态路网中非常有效&#xff08;very efficient for static worlds&#xff09;&#xff0c;但不适于在动态路网&#xff0c;环境如权重等不断变化的动态环境下。 D是动态A&#xff08;D-Star,Dynamic A Star&#xff09; 卡内…

nodejs 如何实现自动化部署?

什么是自动化部署 我接触到的自动化部署概念最早是在 Vercel 上提供的&#xff0c;Vercel 可以提供和 github 联动的功能&#xff0c;通过和你自己的 github 上的某个库建立‘链接’&#xff0c;当你 commit 到 github 远程库时就可以自动部署&#xff0c;Vercel 会帮你完成以…

腾龙健康冲刺A股上市:计划募资10亿元,彭学文家族色彩浓厚

近日&#xff0c;广州腾龙健康实业股份有限公司&#xff08;下称“腾龙健康”&#xff09;预披露招股书&#xff0c;准备在深圳证券交易所主板上市。 本次冲刺上市&#xff0c;腾龙健康计划募资10.13亿元&#xff0c;其中4.09亿元用于水疗按摩池配件生产基地升级项目&#xff0…

数据可视化做出的个人年终总结报告,高颜值更高更具说服力

年终总结与个人业绩、晋升、加薪、离职或留任密切相关。聪明人利用年终报告来总结自己的成就和获得资源&#xff0c;领导者也可以从年终报告看出员工的成长和变化。例如我用可视化互动平台&#xff0c;智能分析做出的公司年终总结报告&#xff0c;高颜值高说服力&#xff0c;领…

Java异常的分类和注意点

异常体系结构 Error与Exception Error是程序无法处理的错误&#xff0c;它是由JVM产生和抛出的&#xff0c;比如OutOfMemoryError、ThreadDeath等。这些异常发生时&#xff0c;Java虚拟机&#xff08;JVM&#xff09;一般会选择线程终止。 Exception是程序本身可以处理的异常…

国内外BI数据分析工具做报表有多大区别?

有什么样的土壤就会早就什么样的产品。国内外企业对报表的不同需求导致了国内外BI数据分析工具做表格时的巨大差异&#xff0c;这也是很多时候国外BI数据分析工具在中国水土不服&#xff0c;遭遇口碑体验两极化的一大原因。下面就来简单看看国内外BI数据分析工具做表格时的不同…

【前端】Vue项目:旅游App-(10)city:以indexBar的形式显示数据

文章目录目标过程与代码分析数据并展示封装到一个组件添加indexBar样式修改优化tab栏的切换效果总代码修改或新增的文件common.csscity.vuecurrentGroupCity.vuemain.js目标 上一篇显示了服务器中的数据&#xff1a;【前端】Vue项目&#xff1a;旅游App-&#xff08;9&#xf…

(九)devops持续集成开发——jenkins流水线发布一个docker版的前端vue项目

前言 本节内容主要介绍如何使用jenkins的流水线发布一个docker版的前端项目。关于本节内容中使用到的jenkins的组件&#xff0c;请参考往期博客内容&#xff0c;自行安装。我们使用NodeJS完成前端项目的编译安装&#xff0c;使用ssh组件完成编译后工程的传输&#xff0c;以及d…

Allegro如何快速复制铜皮到其它层面的两种方法详细操作指导

Allegro如何快速复制铜皮到其它层面的两种方法详细操作指导 在做PCB设计的时候,通常需要复制一个做好的铜皮到其它层面,如下图 需要把L3层的铜皮复制到其它的内层 Allegro支持快速将铜皮拷贝到其它层,下面介绍两种方法,具体操作如下 方法一 选择Edit

快速生成100万条数据并存入mysql数据库(1):游戏人物数据

最近正在一直苦恼如果去获取更多的数据以用来进行后期的查询和进行测试&#xff0c;发现了Navicat这个不错的宝藏&#xff0c;他可以一下子根据你数据库里面创建的各种各样的字段和约束创建出各种各样你自己想要的大量数据&#xff0c;当然这些数据非真实数据而是虚拟数据&…

Swin Transformer原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;CV攻城狮入门VIT(vision transformer)之旅——近年超火的Transformer你再不了解就晚了&#xff01; CV攻城狮入门VIT(vision transformer)之旅——VIT原…