UWP中的文件相关操作
最近开始做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中的文件相关操作的更多相关文章
- Head First Python-Python中与文件相关的操作-读、处理、写
最近在看head first python,前面也写了一些笔记,但是基本上没有涉及到一些完整的代码,现在将书中的文件相关操作的代码整理,供以后参考. 主要分为两大部分,读取文件.处理异常,处理文件.存 ...
- Git基本命令 -- 基本工作流程 + 文件相关操作
可以先找一个已经被git管理的项目, 我就使用这个项目吧: https://github.com/solenovex/ID3-Editor 基本工作流程 克隆以后呢, 进入该目录查看一下状态: 然后添 ...
- python文件相关操作
Python文件相关操作 打开文件 打开文件,采用open方法,会将文件的句柄返回,如下: f = open('test_file.txt','r',encoding='utf-8') 在上面的代码中 ...
- Qt中与文件目录相关操作
一.与文件目录操作有关操作. Qt中与文件目录相关的操作在QDir中,需加入#include <QDir>语句. QDir::drives()是列出电脑根目录下的所有目录,返回的是QFil ...
- linux中Makefile文件相关内容
第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...
- VC++文件相关操作的函数封装实现
在开发编译工具中,需要用到文件的相关操作,于是就封装了相关的函数实现: //判断文件是否存在 BOOL FileIsExist(CString strFileName) { CFileFind fin ...
- Windows系统中监控文件复制操作的几种方式
http://blog.sina.com.cn/s/blog_4596beaa0100lp4y.html 1. ICopyHook 作用: 监视文件夹和打印机移动,删除, 重命名, 复制操作. 可以得 ...
- Nodejs文件相关操作
欢迎关注我的博客我在马路边 适用人群 本文适用于刚接触Node的小白,毕竟我也是小白,大佬请绕行. Node文件操作 在实际开发中遇到很多有关文件及文件夹的操作,比如创建.删除文件及文件夹,文件拷贝. ...
- centos中mariadb的相关操作
Tip 1 在使用mariadb中启动服务报错 : Failed to start mariadb.service: Unit not found. 解决办法: yum install -y mari ...
随机推荐
- Dynamics 365 for CRM:CRM与ADFS安装到同一台服务器,需修改ADFS服务端口号
CRM与ADFS安装到同一台服务器时,出现PluginRegistrationTool 及 CRM Outlook Client连接不上,需要修改ADFS的服务端口号,由默认的808修改为809: P ...
- Hibernate学习笔记四 查询
HQL语法 1.基本语法 String hql = " from com.yyb.domain.Customer ";//完整写法 String hql2 = " fro ...
- C语言-第一次作业
题目6-1 计算两数的和与差 1.设计思路 (1)主要描述题目算法 第一步:看主函数知道程序输入浮点型变量a,b,通过函数计算输出和与差. 第二步:函数部分将a赋值op1,b赋值op2,&su ...
- localhost访问不了的解决方法
c:\windows\system32\drivers\etc\hosts 用记事本打开,加入一行 127.0.0.1 localhost
- Tornado 网站demo 二
连接数据库 methods 中建立一个文件 db.py 分别建立起连接对象和游标对象 #!/usr/bin/env Python # coding=utf-8 import pymysql conn ...
- scrapy 博客爬取
item.py import scrapy class FulongpjtItem(scrapy.Item): # define the fields for your item here like: ...
- WingIDE5.*注册破解方法
WingIDE是Python程序语言设计的集成开发环境,具有语法标签高亮显示,命令自动完成和函数跳转列表等非常强大的功能.本文主要介绍WingIDE 5安装及注册破解方法. 1. WingIDE 5下 ...
- DML数据操作语言之查询(二)
当我们查询出了N条记录之后 ,我们知道一共是几条记录,或者这些记录某一字段(列值)的最大值,最小值,平均值等,就可以使用聚合函数. 1.聚合函数 聚合函数会将null 排除在外.但是count(*)例 ...
- 解决background图片拉伸问题
ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸.src是图片内容(前 ...
- UWP 页面间传递参数(常见类型string、int以及自定义类型)
这是一篇很基础的,大佬就不要看了,也不要喷,谢谢