最近开始做UWP开发,图省事儿就把自己之前一个Winform项目的一部分代码拷贝到了新写的UWP项目中来。整出了一些幺蛾子,下面做一个记录。

首先提一个重点就是:UWP里关于文件的操作尽量用StorageFile类来搞!!!!!!!!!!!!

1.UWP的文件选取

UWP的文件选取使用的是FileOpenPicker,我这里是用来选图片文件的,不多说直接上代码:

            FileOpenPicker fileOpenPicker = new FileOpenPicker();
fileOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
fileOpenPicker.FileTypeFilter.Add(".jpg");
fileOpenPicker.FileTypeFilter.Add(".png");
fileOpenPicker.ViewMode = PickerViewMode.Thumbnail; var imgFile = await fileOpenPicker.PickSingleFileAsync(); if (imgFile == null)
{
return;
}

关于这块儿的具体的各种操作可以去微软爸爸那里查,最标准最权威:https://docs.microsoft.com/zh-cn/windows/uwp/audio-video-camera/imaging

2.文件读取操作

这一块儿的BUG是最让我恶心的!!

最开始的时候这一块儿的代码我是直接从Winform项目里直接拷出来的用的是File.ReadAllBytes,结果Debug的时候什么问题都没有出现,Release出来后直接提示我没有权限访问文件(UnauthorizedAccessException)。。。。。

最初的错误代码(可以在Winform里面用,UWP里面的话Release出来跑不成):

private async Task<List<ByteArrayContent>> GetFileByteArrayContent(HashSet<string> files)
{
List<ByteArrayContent> list = new List<ByteArrayContent>(); foreach (var file in files)
{
await Task.Run(() => {
if(file.Length > )
{
try
{
//file是string类型的文件路径
var fileContent = new ByteArrayContent(File.ReadAllBytes(file));
ContentDispositionHeaderValue dispositionHeader = new ContentDispositionHeaderValue("file");
dispositionHeader.DispositionType = "file";
dispositionHeader.Name = "imageFile";
dispositionHeader.FileName = Path.GetFileName(file);
fileContent.Headers.ContentDisposition = dispositionHeader;
list.Add(fileContent);
}
catch(Exception ex)
{
this.TextBlock_lyric.Text = ex.Message;
}
}
});
}
return list;
}

然后我去微软爸爸那儿里查了一下File.ReadAllBytes函数https://msdn.microsoft.com/en-us/library/system.io.file.readallbytes(v=vs.110).aspx之后发现问题原因应该是没有权限访问文件,查到问题所在后就开始用StorageFile的方法来处理自己所选择的文件修改后的代码如下:

        private async Task<List<ByteArrayContent>> GetByteArrayContents()
{
List<ByteArrayContent> files = new List<ByteArrayContent>();
string exceptionMsg = string.Empty;
if (imgFile != null)
{
try
{
//imgFile是一个StorageFile类的对象
var buffer = await FileIO.ReadBufferAsync(imgFile);
byte[] content = new byte[buffer.Length];
// Use a dataReader object to read from the buffer
using (DataReader dataReader = DataReader.FromBuffer(buffer))
{
dataReader.ReadBytes(content);
// Perform additional tasks
} var fileContent = new ByteArrayContent(content);
ContentDispositionHeaderValue dispositionHeader = new ContentDispositionHeaderValue("file");
dispositionHeader.DispositionType = "file";
dispositionHeader.Name = "imageFile";
dispositionHeader.FileName = imgFile.Path;
fileContent.Headers.ContentDisposition = dispositionHeader;
files.Add(fileContent);
}
catch (Exception ex)
{
exceptionMsg = ex.Message;
}
}
this.TextBlock_lyric.Text += exceptionMsg;
return files;
}

3.其他

更改控件属性的操作不能写到异步操作里,不然会崩

程序里有读取文件的操作的话尽量去把Package.appxmanifest文件里对应的权限开一下,虽然有的人说不开也行。。。但是我头不铁,我还是老老实实开了。

问题解决后总结出一条经验,MSDN真好用!!

  

UWP中的文件相关操作的更多相关文章

  1. Head First Python-Python中与文件相关的操作-读、处理、写

    最近在看head first python,前面也写了一些笔记,但是基本上没有涉及到一些完整的代码,现在将书中的文件相关操作的代码整理,供以后参考. 主要分为两大部分,读取文件.处理异常,处理文件.存 ...

  2. Git基本命令 -- 基本工作流程 + 文件相关操作

    可以先找一个已经被git管理的项目, 我就使用这个项目吧: https://github.com/solenovex/ID3-Editor 基本工作流程 克隆以后呢, 进入该目录查看一下状态: 然后添 ...

  3. python文件相关操作

    Python文件相关操作 打开文件 打开文件,采用open方法,会将文件的句柄返回,如下: f = open('test_file.txt','r',encoding='utf-8') 在上面的代码中 ...

  4. Qt中与文件目录相关操作

    一.与文件目录操作有关操作. Qt中与文件目录相关的操作在QDir中,需加入#include <QDir>语句. QDir::drives()是列出电脑根目录下的所有目录,返回的是QFil ...

  5. linux中Makefile文件相关内容

    第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...

  6. VC++文件相关操作的函数封装实现

    在开发编译工具中,需要用到文件的相关操作,于是就封装了相关的函数实现: //判断文件是否存在 BOOL FileIsExist(CString strFileName) { CFileFind fin ...

  7. Windows系统中监控文件复制操作的几种方式

    http://blog.sina.com.cn/s/blog_4596beaa0100lp4y.html 1. ICopyHook 作用: 监视文件夹和打印机移动,删除, 重命名, 复制操作. 可以得 ...

  8. Nodejs文件相关操作

    欢迎关注我的博客我在马路边 适用人群 本文适用于刚接触Node的小白,毕竟我也是小白,大佬请绕行. Node文件操作 在实际开发中遇到很多有关文件及文件夹的操作,比如创建.删除文件及文件夹,文件拷贝. ...

  9. centos中mariadb的相关操作

    Tip 1 在使用mariadb中启动服务报错 : Failed to start mariadb.service: Unit not found. 解决办法: yum install -y mari ...

随机推荐

  1. Sagit.Framework For IOS 开发框架入门教程5:消息弹窗STMsgBox

    前言: 昨天刚写了一篇IT连创业的文章:IT连创业系列:产品设计之答题模块,(欢迎大伙关注!) 感觉好久没写IOS的文章了,今天趁机,来补一篇,Sagit的教程. Sagit 开源地址:https:/ ...

  2. 后端Nodejs利用node-xlsx模块读取excel

    后端Nodejs(利用node-xlsx模块) /** * Created by zh on 16-9-14. */ var xlsx = require("node-xlsx") ...

  3. Loadrunner初学

    1.创建脚本 启动Vvitrual User Generator 创建脚本 因为我们选择录制页面相关的操作,则选择web(HTTP/HTML) application type 选择是录制浏览器网页还 ...

  4. 数据库中插入数据时发生ora-00984错误

    操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误,如下图所示: 出现的原因是由于,在插入字符或字符串型字段时.如果插入的数据是纯数字,则不会有错误:如果出现字符,则会报OR ...

  5. [BZOJ 1190][HNOI2007]梦幻岛宝珠

    1190: [HNOI2007]梦幻岛宝珠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1057  Solved: 611[Submit][Stat ...

  6. Go语言的数组

    在 Go 语言里,数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块.数组存储的类型可以是内置类型,如整型或者字符串,也可以是某种结构类型. 1 数组特性 (1)内存是连续分配,C ...

  7. Beta总结篇

    45°炸 031502601 蔡鸿杰 031502604 陈甘霖 031502632 伍晨薇 一.项目预期进展及现实进展 项目预期计划 现实进展 Github使用 √ 日拍 (调用相机.相册) √ 足 ...

  8. Beta敏捷冲刺每日报告——Day1

    1.情况简述 Beta阶段Scrum Meeting 敏捷开发起止时间 2017.11.2 00:00 -- 2017.11.3 00:00 讨论时间地点 2017.11.2 晚9:30,电话会议会议 ...

  9. 敏捷冲刺每日报告五(Java-Team)

    第五天报告(10.29  周日) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...

  10. 201621123057 《Java程序设计》第8周学习总结

    1. 本周学习总结 思维导图归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 ArrayList是允许重复的,但当用它来 ...