在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/WPF]在应用开发中安全使用文件资源的更多相关文章

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

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

  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. 机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)

    摘要: 数据挖掘.机器学习和推荐系统中的评测指标—准确率(Precision).召回率(Recall).F值(F-Measure)简介. 引言: 在机器学习.数据挖掘.推荐系统完成建模之后,需要对模型 ...

  2. python 如何把小数变成百分数格式

    1. 数据样本 ,valid_rate,homework_rate,inter_rate,playback_rate,zhujiang_good_comment5_rate,fudao_good_co ...

  3. android toolbar效果

    layout下的layout_main.xml: <?xml version="1.0" encoding="utf-8"?> <Relati ...

  4. centos7使用rpm方式安装mysql

    https://blog.csdn.net/smiles13/article/details/81460617    (部分参考) 先查看是否安装mariadb rpm -qa | grep mari ...

  5. Swift 通过运行时获取属性名列表

    import UIKit //必须要有@objcMembers修饰符,否则获取到的成员属性为0 @objcMembers class Person: NSObject { var name: Stri ...

  6. Elasticsearch **代码片段

    ```JAVA BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); RangeQueryBuilder createTimeQuery ...

  7. ENVIRONMENT

    ENVIRONMENT Generalizations Congratulations! You learned to use the bash profile to configure the en ...

  8. 550 5.7.1 Client does not have permissions to send as this sender

    收发邮件时出现以上这种情况,系统提示550 5.7.1 Client does not have permissions to send as this sender,这是什么原因赞成的呢? 活动目录 ...

  9. 吴裕雄 python深度学习与实践(16)

    import struct import numpy as np import matplotlib.pyplot as plt dateMat = np.ones((7,7)) kernel = n ...

  10. svg旋转动画

    <!doctype html><html><head> <title>test</title> <meta charset=" ...