在字符串操作中有一类比较特殊的操作,就是对包含文件或目录路径信息的 System.String 实例执行操作。比如根据一个表示路径的字符串获取其代表的文件名称、文件夹路径、文件扩展名等。在很多时候,我们喜欢用substring加indexof来进行字符串的修改。代码如下:

string filePath = @"C:\test\test2\test3.txt";

//通过substring加indexof方式获取文件信息
string fileName = filePath.Substring(filePath.LastIndexOf('\\') + 1); //通过substring加indexof方式获取文件信息
string fileExtenstion = filePath.Substring(filePath.LastIndexOf('.') + 1); //通过substring加indexof方式获取文件信息
string fileNameWithOutExtenstion = filePath.Substring(
filePath.LastIndexOf('\\') + 1,
filePath.LastIndexOf('.') - filePath.LastIndexOf('\\') - 1);

上面这种做法前两个还算比较好写,只要注意下+1就行了,但是最后一个却不是一下就能写对的,我调了两次才改对的。而且这种代码的可阅读性非常不好,不加注释的话,新手很难一下看明白。下面是另一种写法,主要运用FileInfo这个类。

var fileInfo = new FileInfo(filePath);
string name = fileInfo.Name;
string extens = fileInfo.Extension;
string nameWithOutExtenstion = name.Remove(name.IndexOf(".", StringComparison.Ordinal));

上面的代码看起来要比最开始的substring+indexof方案阅读性更好,而且写的时候更靠谱,不用担心出现像上面那种忘记“+1”的错误。但是存在如下问题:

1. 引入了FileInfo这个类,这是一个文件操作的类,仅仅为了获取文件名称等有些大材小用;
2. 还是没法获取不带文件扩展名的文件名称;

其实.Net 给我们提供了更好的解决方案,就是大家经常用到的Path类。完成上面功能的代码如下:

string nameFromPath = Path.GetFileName(filePath);
string extenstionFromPath = Path.GetExtension(filePath);
string nameWithoutExtensionFromPath = Path.GetFileNameWithoutExtension(filePath);

上述代码非常简洁易懂,而且写法高效,非常值得推荐。以下是Path的一些其它API:

//得到文件的目录
string dirName = Path.GetDirectoryName(filePath); //得到文件的全路径
string fullPath = Path.GetFullPath(filePath); // 获取指定路径的根目录信息。
//如果 path 为 null,则为 null;
//如果 path 不包含根目录信息(比如相对路径),则为空。
string pathRoot = Path.GetPathRoot(filePath); //得到随机文件夹名或文件名,省得起名字了,但注意这个名字带后缀。
string randomName = Path.GetRandomFileName(); // 返回当前用户的临时文件夹的路径,以反斜杠结尾。
string tempPath = Path.GetTempPath(); //获取包含不允许在文件名中使用的字符的数组,在写界面的时候可以增加输入合法性的判断
char[] invalidFileName = Path.GetInvalidFileNameChars(); //获取包含不允许在路径名中使用的字符的数组
char[] invalidPathName = Path.GetInvalidPathChars(); //将字符串数组组合成一个路径。(比以前好用多了,增加不定参数的支持)
string combinePath = Path.Combine(filePath1, filePath2, filePath3); //获取一个值,该值指示指定的路径字符串是否包含根
bool isContainsRoot = Path.IsPathRooted(filePath);

除了上述方法之外,还提供了一些其它readonly的变量,在我们写代码的时候都可以拿来用。具体如下:

// 摘要:
// 提供平台特定的替换字符,该替换字符用于在反映分层文件系统组织的路径字符串中分隔目录级别。
public static readonly char AltDirectorySeparatorChar;
//
// 摘要:
// 提供平台特定的字符,该字符用于在反映分层文件系统组织的路径字符串中分隔目录级别。
public static readonly char DirectorySeparatorChar;
//
// 摘要:
// 用于在环境变量中分隔路径字符串的平台特定的分隔符。
public static readonly char PathSeparator;
//
// 摘要:
// 提供平台特定的卷分隔符。
public static readonly char VolumeSeparatorChar;

总结

1. 如果已经提供了轮子,那我们就不要自己造轮子;
2. 如果提供了好几种轮子,那我们需要挑安全、好用的轮子。

C# 对包含文件或目录路径信息的 System.String 实例执行操作的更多相关文章

  1. iOS 获取文件的目录路径的几种方法 [转]

    iOS 获取文件的目录路径的几种方法 2 years ago davidzhang iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. d ...

  2. IOS中获取各个文件的目录路径的方法和NSFileManager类

    转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永 ...

  3. iOS中获取各种文件的目录路径的方法

    我们的app在手机中存放的路径是:/var/mobile/Applications/4434-4453A-B453-4ADF535345ADAF344 后面的目录4434-4453A-B453-4AD ...

  4. (转)IOS中获取各种文件的目录路径的方法

    iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory ...

  5. iOS中获取各种文件的目录路径和文件

    iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory ...

  6. IOS中获取各种文件的目录路径的方法-备

    iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory ...

  7. linux文件和目录的删除、新建、移动等操作

    在Linux下进行切换目录   cd 在Linux下查看当前目录下的内容   ls.  ll.  ls -al 如何显示当前命令所在的目录路径   pwd 在Linux下创建目录   mkdir 在L ...

  8. 使用File查询出所有的文件和目录的信息

    public class Test34 { public static void main(String[] args) { File f=new File("f:"); File ...

  9. JAVA->查询并显示输入根目录下全部的文件所在目录路径

    public static boolean qf(File f,boolean a){      boolean b=false;   if(a==true){      File[] fl=f.li ...

随机推荐

  1. Jpanel和container和jframe的区别

    Jpanel和container和jframe的区别 (2012-05-23 19:15:11) 转载▼ 标签: 杂谈 分类: room 看到上上面的几张图,container容器是位于最高层. 下面 ...

  2. Windows如何修改MySQL用户root密码

    听语音 浏览:16925 | 更新:2015-06-12 14:49 | 标签:windows 1 2 3 4 5 6 分步阅读 MySQL是一个关系型数据库管理系统,在 WEB 应用方面 MySQL ...

  3. onselectstart和onselect的使用

    1.onselectstart 这个事件主要是用于禁止选择网页中的文字.代码为: document.onselectstart =function(){ return false; } 另外ff/op ...

  4. C语言小练习四

    题目要求:输入N个数,输出该数列中第k个最大者. 程序源码: #include <stdio.h> #include <string.h> void printResult(i ...

  5. Unity4升级Unity5后Image Effects问题

    Assets\Editor\Image Effects\CameraMotionBlurEditor.js 会出现Ambiguous reference 'preview'错误提示,解决方法 查找pr ...

  6. bootstrap框架 导航条组件使用

    本文记载boot 导航条组件使用方法 导航条组件 导航条是在您的应用或网站中作为导航页头的响应式基础组件.它们在移动设备上可以折叠(并且可开可关),且在视口(viewport)宽度增加时逐渐变为水平展 ...

  7. express教程

    原文地址 http://javascript.ruanyifeng.com/nodejs/express.html JavaScript 标准参考教程(alpha) 草稿二:Node.js Expre ...

  8. 微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决

    微信小程序上传图片的时候,如果是多图片上传,一般都是直接用一个循环进行wx.uploadFile 这个在电脑上面测试与苹果手机上面都不会有什么问题 但当用安卓测试的时候,你会发现小程序会提示一个the ...

  9. iOS-三方框架AFNetworking基本使用

    AFNetworking 是基于NSURLConnection, NSOperation开发的一款三方框架,主要用于处理一些关于网络请求上的业务,下文会简单介绍框架中经常使用的功能,如文件的上传,下载 ...

  10. 爬虫爬数据时,post数据乱码解决办法

    最近在写一个爬虫,目标网站是:http://zx.bjmemc.com.cn/,可能是为了防止被爬取数据,它给自身数据加了密.用谷歌自带的抓包工具也不能捕获到数据.于是下了Fiddler.     F ...