一、介绍

  Path类如其名,是专门用来处理和路径相关的事情的,需要引用System.IO。Path类是一个静态类,因此它所有的方法及字段都是静态的,访问的时候不能用对象去访问,而是直接通过类名访问。

二、成员介绍

  先介绍几个只读字段:

字段  功能
char DirectorySeparatorChar; 得到目录分隔符。在windows里,目录分隔符是'\'。
char AltDirectorySeparatorChar; 得到替换的目录分隔符。返回结果是'/',意思是用'/'也能进行目录分隔。
char VolumeSeparatorChar; 得到卷分隔符。在windows中,比如"C:\Users"表示一个路径,':'就是卷分隔符。
char[] InvalidPathChars; 得到不能在路径中出现的字符,但这个字段被Obsolete修饰,表示它已经过时,不建议再使用这个字段。下一节介绍两个方法可以代替这个字段。
char PathSeparator; 得到在环境变量中分隔不同路径的符号,其值是';'。意思是设置环境变量的时候,用';'分隔不同的路径。

  方法介绍:

方法 功能
string ChangeExtension(string path, string extension);

改变路径字符串的扩展名。将path包含的扩展名替换为extension。

比如调用Path.ChangeExtension("xxx.mp4", "avi"),返回的结果就是"xxx.avi"。

string Combine(string path1, string path2);

string Combine(string path1, string path2, string path3);

string Combine(string path1, string path2, string path3, string path4);

string Combine(params string[] paths);

Combine有4种重载方法,它的作用是将传入的字符串组合成一个路径。

其实只要有最后一个方法就够了,我也不知道为什么前面还要写前面三个方法。

比如调用Path.Combine("Suzkfly", "Music", "XuSong", "2009", "zidingyi");

得到的结果是:"Suzkfly\Music\XuSong\2009\zidingyi"

string GetDirectoryName(string path);

获得目录名,比如调用Path.GetDirectoryName(@"C:\Users\Suzkfly\Desktop\test.txt");

得到的结果是:@"C:\Users\Suzkfly\Desktop"。它会把文件名和最后一个'\'去掉。

它的机制就是从字符串的末尾开始,往前删除字符,直到删除第一个'\'为止。

也就是说如果传入的路径为@"C:\Users\Suzkfly\Desktop\",就会得到@"C:\Users\Suzkfly\Desktop",

如果传入的路径为@"C:\Users\Suzkfly\Desktop",就会得到@"C:\Users\Suzkfly"。

string GetExtension(string path);

返回指定路径字符串的扩展名。比如调用Path.GetExtension(@"C:\Users\Suzkfly\Desktop\test.txt");,

会得到".txt",注意会把'.'也返回。

string GetFileName(string path);

返回指定路径字符串中的文件名+扩展名。

比如调用Path.GetFileName(@"C:\Users\Suzkfly\Desktop\test.txt");,会得到test.txt。

string GetFileNameWithoutExtension(string path);

返回不具有扩展名的指定路径字符串的文件名。

比如调用 Path.GetFileNameWithoutExtension(@"C:/Users/Suzkfly/Desktop\test.txt");会得到"test"。

string GetFullPath(string path);

返回指定路径的完整路径。这里返回的路径是基于本程序当前运行时所处路径。

另外要注意".",表示当前路径,".."表示上一级路径,比如我现在运行的这个程序所在的路径是@"C:\Users\Suzkfly\Desktop",

那么如果我调用Path.GetFullPath("."),就会返回@"C:\Users\Suzkfly\Desktop",

如果调用Path.GetFullPath(@"..\.."),就会返回@"C:\Users"。

char[] GetInvalidFileNameChars(); 获取不允许出现在文件名中的字符,并将它们放到数组中返回。见第三节。
char[] GetInvalidPathChars(); 获取不允许出现在路径名中的字符,并将它们放到数组中返回。见第三节。
string GetPathRoot(string path);

获取指定路径的根目录信息。如果传入@"C:\Users\Suzkfly\Desktop\test.txt",就会得到@"C:\",

如果传入的路径中不包含根目录就返回空字符串。该方法是进行简单的字符串处理,意味着,它不能通过"."或".."来得到路径。

如果要这么做的话,先用GetFullPath得到完整路径。

string GetRandomFileName(); 返回随机文件夹名或文件名。就是随机得到一个名字。
string GetTempFileName();

在磁盘上创建唯一命名的零字节的临时文件,并返回该文件的完整路径。调用该方法要注意2点,

第一是调用该方法后会在系统中生成文件,第二是生成的文件不会与已经存在的文件重名。

下一个方法指定临时文件所在的路径。

string GetTempPath(); 返回当前用户的临时文件夹的路径。
bool HasExtension(string path); 确定路径是否包括文件扩展名。
bool IsPathRooted(string path); 确定路径中是否包含根(盘符)。

三、不允许出现在文件名和路径名中的字符

  这些字符都是特殊字符,我在Win10中测试,得到的结果如下

  

 

 

   其中黄底的字符,既不能出现在文件名中,也不能出现在路径名中,绿底的不能出现在文件名中(意味着可以出现在路径名中?但是文件夹本身也是文件,它是不能包含这些字符的,所以不知道这有什么意义)。

四、测试代码

using System;
using System.IO;

namespace suzkfly
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("1\t" + Path.DirectorySeparatorChar);
            Console.WriteLine("2\t" + Path.AltDirectorySeparatorChar);
            Console.WriteLine("3\t" + Path.VolumeSeparatorChar);
            Console.WriteLine("4\t" + Path.PathSeparator);

            Console.WriteLine("5\t" + Path.ChangeExtension("xxx.mp4", "avi"));
            Console.WriteLine("6\t" + Path.Combine("Suzkfly", "Music", "XuSong", "2009", "zidingyi"));
            Console.WriteLine("7\t" + Path.GetDirectoryName(@"C:\Users\Suzkfly\Desktop\test.txt"));
            Console.WriteLine("8\t" + Path.GetExtension(@"C:\Users\Suzkfly\Desktop\test.txt"));
            Console.WriteLine("9\t" + Path.GetFileName(@"C:\Users\Suzkfly\Desktop\test.txt"));
            Console.WriteLine("10\t" + Path.GetFileNameWithoutExtension(@"C:/Users/Suzkfly/Desktop\test.txt"));
            Console.WriteLine("11\t" + Path.GetFullPath(@"."));

            char[] invalidfilenamechars = Path.GetInvalidFileNameChars();
            Console.Write("12\t");
            foreach (var i in invalidfilenamechars)
            {
                Console.Write(Convert.ToInt32(i));
                Console.Write(' ');
            }
            Console.WriteLine();

            char[] invalidpathchars = Path.GetInvalidPathChars();
            Console.Write("13\t");
            foreach (char i in invalidpathchars)
            {
                Console.Write(Convert.ToInt32(i));
                Console.Write(' ');
            }
            Console.WriteLine();

            Console.WriteLine("14\t" + Path.GetPathRoot(@"C:\Users\Suzkfly\Desktop\test.txt"));
            Console.WriteLine("15\t" + Path.GetRandomFileName());   //不会创建文件
            Console.WriteLine("16\t" + Path.GetTempFileName());     //会在C:\Users\Suzkfly\AppData\Local\Temp目录下创建文件
            Console.WriteLine("17\t" + Path.GetTempPath());
            Console.WriteLine("18\t" + Path.HasExtension(@"C:\Users\Suzkfly\Desktop\test"));
            Console.WriteLine("19\t" + Path.IsPathRooted(@"D:\Users\Suzkfly\Desktop\test.txt"));

            Console.ReadKey();
        }
    }
}