在字符串操作中有一类比较特殊的操作,就是对包含文件或目录路径信息的 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. 如果提供了好几种轮子,那我们需要挑安全、好用的轮子。

最新文章

  1. DOM Document
  2. angularJS配合bootstrap动态加载弹出提示内容
  3. ACdream 1214---矩阵连乘
  4. MongoDB学习笔记——数据库操作
  5. Nginx location 匹配规则
  6. sql alter表字段处理
  7. Hbase的安装测试工作
  8. 移植mysql到嵌入式ARM平台
  9. DOM注意事项(八):JavaScript操作环境和垃圾收集
  10. 一些DevExpress控件概况!!!!主要DocumentManager.WindowsUIView.Tile
  11. python自学笔记(十一)关于函数及书写格式
  12. SVN报E155024: Invalid relocation destination
  13. C++ Primer 笔记——多重继承与虚继承
  14. C#二分查找算法设计实现
  15. Django组件——分页器和中间件
  16. SRC列表收集
  17. Star HDU1541
  18. 题目1144:Freckles(最小生成树进阶)
  19. 用原生的javascript 实现一个无限滚动的轮播图
  20. 常用CSS实例

热门文章

  1. 自动生成Model层中对应表的各个字段
  2. Android LayoutInflater原理分析,带你一步步深入了解View(一)
  3. C# 有关打印机的连接判断...随便看看
  4. 【转】简易smtp调用类
  5. 16.iOS APP图标和启动画面尺寸
  6. jQuery操作Dom、jQuery事件机制、jQuery补充部分
  7. 【分块打表】bzoj1662 [Usaco2006 Nov]Round Numbers 圆环数
  8. eclipse js 引用跳转
  9. 微信分享接口SDK简介使用
  10. (多重背包+记录路径)Charlie's Change (poj 1787)