浅析C#中文件路径的操作
作者:Brook_icv 发布时间:2023-11-09 16:24:30
在程序中对文件操作是非常常见的,而对文件的操作则不可避免的需要文件的路径,并对文件的路径进行一系列的操作,例如:判断已知的路径是一个目录还是一个文件,路劲是一个文件则该文件的名称是什么,文件的扩展名名是什么等等。在C#中并并没有将文件的路径抽象为一个类,用来表示文件路径就是一个普通的字符串。对文件路径的操作例如,要获取文件名称,可以通过截取字符串或者使用正则表达式来取得。
其实,在.NET类库中,有一个专门的功能类System.IO.Path,对表示文件或在目录路径的string进行操作。下面介绍下利用Path来对文件路径进行的一些诶常用操作。
判断给出的路径或者文件名是否合法
Path.GetInvalidFileNameChars() 该方法返回一个char[] 指出不能在文件名中出现的字符。
/// <summary>
/// 判断文件名是否合法
/// </summary>
/// <param name="fileName">文件名</param>
/// <returns>ture,合法;false,非法</returns>
public bool validFileName(string fileName)
{
if(!string.IsNullOrEmpty(fileName))
{
char [] errChars = Path.GetInvalidFileNameChars() ;
foreach(char ch in errChars)
{
if(fileName.Contains(ch.ToString()))
return false ;
}
}
else
{
return false ;
}
return true ;
}
假如文件名称是非法的,可以利用下面的方法,移除非法字符
/// <summary>
/// 除掉文件名中的非法字符
/// </summary>
/// <param name="fileName"></param>
/// <returns>合法的文件名</returns>
public string fixedFileName(string fileName)
{
char[] errChars = Path.GetInvalidFileNameChars();
StringBuilder fileNameBuilder = new StringBuilder(fileName) ;
foreach(char ch in errChars)
{
fileNameBuilder.Replace(ch.ToString(),string.Empty);
}
return fileNameBuilder.ToString();
}
同理使用Path.GetInvalidPathChars()来获取不能在目录路径中出现的字符,来判断给出的目录路径是否合法,并且对非法的目录路径进行修改。
判断给出的路径是目录路径还是文件路径
如果能够确定给出的路径是已经存在的,那么可以使用Directory.Exists()和File.Exists()来判断路径是目录还是文件。不能确定给定的路径存在,可以使用Path.GetFileName()获取路径中的文件名,如能取到文件名显然路径是一个文件路径,如不能则是路径。说明,目录路径的最后一个字符应该是以'\'来结束。
合并路径
有些路径的不同部分是从不同的地方取得,这是需要将这些部分进行组合,形成一个完整的路径。在组合的过程中不可避免的要涉及到对”\”的处理,这时可以使用Path.Combine()把路径的不同部分组合到一起。Path.Combine()有多种形式的重载,满足不同的需求。需要说明的是,在用Path.Combine()不接受不合法的文件名或者路径名,并且在合并时,如果某一个部分是从绝对路径开始的,则合并操作重置为从该绝对路径开始,舍弃前面的已经合并的路径。例如:
string[] paths = {@"d:\archives", "2001", "e:\\", "images"};
string fullPath = Path.Combine(paths);
//fullPath 为 e:\images
Console.WriteLine(fullPath);
fullPath为e:\images
获取路径的特定部分,如:文件名,扩展名,文件目录等
Path.GetFileName(path);//获取文件名
Path.GetFileNameWithoutExtension(path); //获取文件名,不带扩展名
Path.GetExtension(path) ; //获取文件扩展名
Path.GetDirectoryName(path) ; //获取文件目录
Path.GetPathRoot(path) ;//获取根目录信息
更具体的可以参看MSDN http://msdn.microsoft.com/zh-cn/library/system.io.path_methods.aspx
Path其它的一些功能函数
Path.GetRandomFileName() 获取一个随机的文件名或者目录名
Path.GetTempFileName() 创建磁盘上唯一命名的零字节的一个临时文件并返回该文件的完整路径
Path.GetTempPath() 获取当前用户的临时目录路径
Path.HasExtension() 确定路径是否包含文件扩展名
获取和应用程序相关的路径
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 获取模块的完整路径,包括文件名。
System.Environment.CurrentDirectory 获取或设置应用程序当前工作目录的完全限定路径
System.IO.Directory.GetCurrentDirectory() 获取或设置应用程序的当前工作目录,不一定是应用程序的启动目录,是应用程序最后一次操作过的目录。
环境变量相关
使用System.Environment.GetEnvironmentVariable()能够获取和环境变量相关的文件路径,例如:
System.Environment.GetEnvironmentVariable("windir") 获取操作系统所在的目录
System.Environment.GetEnvironmentVariable("INCLUDE") 获取头文件所在的目录
System.Environment.GetEnvironmentVariable("TMP") 获取临时目录
System.Environment.GetEnvironmentVariable("Path") 获取Path环境变量所包含的文件目录
自然,使用System.Environment.SetEnvironmentVariable() 能够设置环境变量
来源:http://www.cnblogs.com/wangguchangqing/archive/2013/04/02/2992660.html
猜你喜欢
- 简介本文介绍Java的List的正确的删除方法。实例需求:有如下初始数据,将list中的所有数据为"b"的元素删除掉。即
- LongAdder实现原理图高并发下N多线程同时去操作一个变量会造成大量线程CAS失败,然后处于自旋状态,导致严重浪费CPU资源,降低了并发
- 归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序
- 问题描述:idea输入中文,没输入几个拼音就好像自动回车,有时得到几个字母,然后就不能输入拼音了。遇到这个情况就导致输入中文特别困难,可以采
- 本文实例讲述了C#导出数据到Excel文件的方法。分享给大家供大家参考。具体实现方法如下:/// <summary>/// 导出
- 目录一 . 前言二 . 流程梳理2.1 实例化创建2.1.1 doGetBean 入口2.1.2 doGetBean 补充节点2.1.3 A
- 什么是自旋锁说道自旋锁就要从多线程下的锁机制说起,由于在多处理器系统环境中有些资源因为其有限性,有时需要互斥访问(mutual exclus
- Swagger2配置(解决404报错)在spring boot项目中配置Swagger2,配置好了但是访问确实404,SwaggerConf
- PowerMockito 测试静态方法假如有下面一个类DemoStatic,它里面定义了各种静态方法,这些静态方法可能是一些Utilitie
- 在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行
- 分享一个在项目中用的到文件上传下载和对图片的压缩,直接从项目中扒出来的:)package com.eabax.plugin.yundada.
- 上一篇博文《Android中Handler使用浅析》通过实现倒计时闪屏页面的制作引出了Handler的使用方法以及实现原理,博文末尾也提到了
- 1.封装什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问。此时就要提到一个关键字
- 第一步。根据卷标,CPU序列号,生成机器码// 取得设备硬盘的卷标号
- 本文实例讲述了WinForm生成验证码图片的方法。分享给大家供大家参考,具体如下:1、创建ValidCode类:public class V
- 本文介绍一些Java初学者常问的问题,可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区别吗? 声明一个数组为什么需
- 本文实例讲述了C#双向链表LinkedList排序实现方法。分享给大家供大家参考。具体如下:1.函数打印链表函数PrintLinkedLis
- import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pi
- 这篇文章主要介绍了springmvc处理模型数据ModelAndView过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一
- 前言Spring JPA是目前比较常用的ORM解决方案,但是其对于某些场景并不是特别的方便,例如查询部分字段,联表查询,子查询等。而接下来我