关闭

【Unity_UWP】Unity 工程发布win10 UWP 时的本地文件读取 (上篇)

标签: unity3d经验UWP
505人阅读 评论(1) 收藏 举报
分类:

Universal Windows PlatformUWP)是微软Windows10专用的通用应用平台,其目的在于在统一操作系统下控制所有智能电子设备。

自从Unity 5.2之后,配合VS 2015和Windows 10 SDK就能够将Unity工程发布为UWP APP。可是这当中仍有数不清的雷区,比如文件读取。

本篇是UWP文件读取的铺垫,下篇是Unity转UWP的文件读取

-----------------------------------

一、  文件权限

UWP对于文件的读写权限控制极其严格。一般来说,发布好的UWP应用只允许读取以下少数文件夹:

A) Win 10基础文件夹:视频、图片、音乐、文档

B) 应用文件夹:应用安装目录、应用漫游目录、应用缓存目录

 

二、  适用类

当我兴高采烈地将我的工程发布为UWP时,第一个坑出现在

FileStream fs=new FileStream(string,FileMode,FileAccess);

FileStream类在传统的C#或Unity工程中功能十分强大;但是在UWP中,该类下的方法少了一半不说,严格的读写权限让FileStream全无用武之地。即使在“FileMode.Open”和”FileAccess.Read”下,系统报错信息显示我的堆泄漏了,读取就是空谈。

 

所以,我也采用了Windows.Storage命名空间来进行读取(用StorageFolder和StorageFile)。

并且Windows.Storage.KnownFolders 中包含了Win 10系统下的多个已知目录文件夹:

①  视频库=Windows.Storage.KnownFolders.VideosLibrary

②  图片库= Windows.Storage.KnownFolders.PicturesLibrary

③  音乐库= Windows.Storage.KnownFolders.MusicsLibrary

④  文档= Windows.Storage.KnownFolders.DocumentsLibrary

⑤  可移动设备= Windows.Storage.KnownFolders.RemovableDevices(据说是将所有接入该PC的移动设备都归纳到这个目录中,再进行索引,我并未尝试)


 

而常用的读取文本文件的方法如下(路径:“文档\Data\fff.txt”)(我制作出了一个Xaml按钮事件:将文本的文字赋给textBlock):

private async void button_Click(object sender, RoutedEventArgs e)
        {
            StorageFolder docLib = await KnownFolders.DocumentsLibrary.GetFolderAsync("Data");
            StorageFile docFile = await docLib.GetFileAsync("fff.txt");
            string s;
            using (Stream fs = await docFile.OpenStreamForReadAsync())
            {
                using (StreamReader read = new StreamReader(fs))
                {
                    s = read.ReadToEnd();
                }
            }
            textBlock.Text = s;
        }

然而考虑到读取字节并转变为别的变量,更通用的方法为:

private async void button_Click(object sender, RoutedEventArgs e)
        {
            StorageFolder docLib = await KnownFolders.DocumentsLibrary.GetFolderAsync("Data");
            StorageFile docFile = await docLib.GetFileAsync("fff.txt");
            string s;
            using (Stream fs = await docFile.OpenStreamForReadAsync())
            {
                byte[] byData = new byte[fs.Length];
                fs.Read(byData, 0, (int)fs.Length);
                s = System.Text.Encoding.UTF8.GetString(byData);
            }
            textBlock.Text = s;
        }

其中,byData就是取出的字节,至于转换成什么大家自己玩。 

上述代码需要 using Windows.Storage和 using System.IO。

这种方法使用了异步机制,在纯Xaml写出的UWP应用中运行无碍。

之后,大家还需要在解决方案资源管理其中找到Package.appxmanifest:

①右键查看代码,并在<Capabilities>元素下添加:

<Capabilities>  
<uap:Capability Name="documentLibrary">//如果是图片库和音乐库等,则可以直接双击点开,并在查看器中勾选。文档库没有这种便利。  
</Capabilities>

②双击点开Package.appxmanifest,在“声明”中添加“文件类型关联”,我用到了.txt  



可是!

在Unity中: 

①Unity没有Windows.Storage命名空间

②Unity的C#版本只有4.0,不支持诞生于4.5的async/await异步机制(StorageFile一定会用到)。所以——我会在下篇讲述在Unity中的具体方法





   
1
0

猜你在找
【直播】机器学习&深度学习系统实战(唐宇迪)
【直播】Kaggle 神器:XGBoost 从基础到实战(冒教授)
【直播回放】深度学习基础与TensorFlow实践(王琛)
【直播】计算机视觉原理及实战(屈教授)
【直播】机器学习之凸优化(马博士)
【直播】机器学习之矩阵(黄博士)
【直播】机器学习之概率与统计推断(冒教授)
【直播】机器学习之数学基础
【直播】TensorFlow实战进阶(智亮)
【直播】深度学习30天系统实训(唐宇迪)
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5552次
    • 积分:186
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论