原文:[UWP]在应用开发中安全使用文件资源

在WPF或者UWP应用开发中,有时候会不可避免的需要操作文件系统(创建文件/目录),这时候有几个坑是需要大家注意下的。

创建文件或目录时的非法字符检测

在Windows系统中,我们创建文件时会注意到,某些特殊字符是不可以用作文件名输入的。

那么,同样的,如果你的应用可以提供给用户创建文件/目录的功能,要特别注意的是:你必须对用户键入的文件或者目录名检测,避免用户键入非法字符。

否则,应用可能会遇到下面这个bug:System.IO.FileNotFoundException:“文件名、目录名或卷标语法不正确。”

避免手段其实也很简单,System.IO.Path类中可以获取到所有的非法字符,我们只需要检测文件或目录名,避免出现非法字符就可以了。

不可以在文件名中出现的字符 Path.GetInvalidFileNameChars():

char[41] { '"', '<', '>', '|', '\0', '\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\a', '\b', '\t', '\n', '\v', '\f', '\r', '\u000e', '\u000f', '\u0010', '\u0011', '\u0012', '\u0013', '\u0014', '\u0015', '\u0016', '\u0017', '\u0018', '\u0019', '\u001a', '\u001b', '\u001c', '\u001d', '\u001e', '\u001f', ':', '*', '?', '\\', '/' }

不可以在路径字符串中出现的字符 Path.GetInvalidPathChars():

char[36] { '"', '<', '>', '|', '\0', '\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\a', '\b', '\t', '\n', '\v', '\f', '\r', '\u000e', '\u000f', '\u0010', '\u0011', '\u0012', '\u0013', '\u0014', '\u0015', '\u0016', '\u0017', '\u0018', '\u0019', '\u001a', '\u001b', '\u001c', '\u001d', '\u001e', '\u001f' }

这里给大家提供一个小窍门,使用C#交互窗口(VS2015及更高版本都可以使用),可以快速查看代码片段执行结果。

在XAML中引用外部资源时的非法字符检测

此外,在开发WPF或者UWP应用时,如果我们需要在XAML中引入外部资源URI,那么情况会比较特殊一点。

有时候尽管你的文件名或者路径URI均没有包含Windows文件系统中的非法字符,应用仍有可能崩溃。这是因为,在XAML中定义了一些不允许出现的字符,这些字符与Windows文件系统中的非法字符不尽相同。

这些字符是:

{ ';' , '/' , '?' , ':' , '@' , '&' , '=' , '+' , '$' , ',','<' , '>' , '#' , '%' , '"' }

例如‘#’,它在文件系统中是合法字符,但是却不能出现在XAML中引入的外部资源URI字符串里。

这个问题在邵猛大佬的《WPF 图片显示中的保留字符问题》中也是有讲到的,但是文章中没有给到解决方法。

在某些情况下,如开发应用时,我们允许用户上传图片到应用文件夹下作为资源使用,我们可以在拷贝资源时通过排除/替换文件名里非法字符的方法来避免这个BUG。

public static class XamlUriHelper
{
private static readonly char[] Excluded = { ';' , '/' , '?' , ':' , '@' , '&' , '=' , '+' , '$' , ',','<' , '>' , '#' , '%' , '"' }; public static string GetValidName(string fileName)
{
foreach (var item in Excluded)
{
fileName = fileName.Replace(item, '_');
}
return fileName;
}
}

结尾

上面说到的两种情况,第一种是比较好处理的,而第二种需要一些折中的处理手段。另外吐槽一点,XAML应用这么久了,第二种情况按理说是不应该出现的,不知道微软方面有没有注意到(或者说是否有官方解决方法,类似转义符什么的?)。如果有了解这个问题的大佬,欢迎在评论区指出!

这篇博文到此结束,谢谢大家!

[UWP]在应用开发中安全使用文件资源的更多相关文章

  1. [UWP/WPF]在应用开发中安全使用文件资源

    在WPF或者UWP应用开发中,有时候会不可避免的需要操作文件系统(创建文件/目录),这时候有几个坑是需要大家注意下的. 创建文件或目录时的非法字符检测 在Windows系统中,我们创建文件时会注意到, ...

  2. 豹哥嵌入式讲堂:ARM开发中有用的文件(1)- source文件

    大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的source文件种类. 众所周知,嵌入式开发属于偏底层的开发,主要编程语言是C和汇编.所以本文要讲的source文件主要指的就 ...

  3. stm32 开发中startup.s文件中常见的命令功能

    由于C的普及以及编译器的发展,越来越多的软件工程师在编程时很少有机会接触到汇编语言.在ARM的开发中,我们不可避免的会遇到启动文件的编写,在KEIL环境中一般采用了startup.s的文件作为启动代码 ...

  4. 删除项目开发中的.pyc文件

    在实际开发中python会自动生成很多pyc文件,但是这些pyc文件是不需要我们追踪的,删除了对项目也没有影响,下面是删除pyc文件的方法. Linux或Mac系统 find /tmp -name & ...

  5. Android开发中string.xml文件的使用

    为什么需要把应用中出现的文字单独存放在string.xml文中呢? 一:是为了国际化,Android建议将在屏幕上显示的文字定义在strings.xml中,如果今后需要进行国际化,比如我们开发的应用本 ...

  6. ios UIWebView 在开发中加载文件

    UIWebView 在实际应用中加载文件的时候,有两种情况, 1. 实行在线预览 , 2. 下载到本地,再查看 如果是第一种情况: NSURL *url = [NSURL URLWithString: ...

  7. Windows内核开发中如何区分文件对象究竟是文件还是文件夹?

    今天有同行问了一个问题,Windows文件过滤驱动里的如何去区分一个对象是文件还是文件夹?我花了1小时左右翻阅了一些微软的文档以及以前的遗留代码,发现在WDK的帮助文档中是这么定义的: FILE_OB ...

  8. android 开发中 添加库文件 和so 文件的存放位置和添加依赖

    so文件一般存储在  main 当中  jniLibs 当中 然后在build.gradle中添加 sourceSets { main { jniLibs.srcDirs = ['src/main/j ...

  9. 关于iOS开发中info.plist文件的解读

    我们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除.  下面就对其ke ...

随机推荐

  1. log4j 2.x 版本的 properties 配置

    #用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出status = debugdest = errname = PropertiesConf ...

  2. POJ 2479 Maximum sum POJ 2593 Max Sequence

    d(A) = max{sum(a[s1]..a[t1]) + sum(a[s2]..a[t2]) | 1<=s1<=t1<s2<=t2<=n} 即求两个子序列和的和的最大 ...

  3. AE中Shapefile文件添加到SDE数据集

    linder_lee 原文 AE中Shapefile文件添加到SDE数据集(c#) 主要完成用C#,通过AE将本地Shapefile文件导入到SDE的指定数据集下面. 首先说下思路: (1) 通过Op ...

  4. Android 利用an框架快速实现夜间模式的两种套路

    作者:Bgwan链接:https://zhuanlan.zhihu.com/p/22520818来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 网上看到过大多实现夜间模 ...

  5. POJ 1745 Divisibility DP

    POJ:http://poj.org/problem?id=1745 A完这题去买福鼎肉片,和舍友去买滴~舍友感慨"这一天可以卖好几百份,每份就算赚一块钱..那么一个月..一年...&quo ...

  6. Injector Job深入分析 分类: H3_NUTCH 2015-03-10 15:44 334人阅读 评论(0) 收藏

    Injector Job的主要功能是根据crawlId在hbase中创建一个表,将将文本中的seed注入表中. (一)命令执行 1.运行命令 [jediael@master local]$ bin/n ...

  7. System.ComponentModel.Win32Exception (0x80004005):拒绝访问。——解决办法

    一.问题如下: (无法执行程序.所执行的命令为 "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" /noconfi ...

  8. angular的Dom操作

    原文 https://www.jianshu.com/p/9d7249922bda 大纲 1.angular的DOM操作 2.为什么不能直接操作DOM? 3.三种错误操作DOM的方式 4.angula ...

  9. 【48.51%】【poj 1611】The Suspects

    Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 34447 Accepted: 16711 Description Severe ...

  10. VCS编译仿真警告Warning

    VCS编译仿真警告Warning 问题描述 在较大的SOC集成中,通常使用Perl脚本例化子模块到Top层,然而,有时会出现例化出来的输入端口名没有在Top层定义,而且端口的位宽为1bit,那么,ve ...