【C# IO 操作】 Path 路径类 |Directory类 |DirectoryInfo 类|DriveInfo类|File类|FileInfo类|FileStream类
Directory类
Directory类 是一个静态类,常用的地方为创建目录和目录管理。
一下来看看它提供的操作。
1、CreateDirectory 根据指定路径创建目录。有重载,允许一次过创建多个目录。
2、Delete 删除指定的目录。 有重载,指示目录有子目录的情况下,是否删除子目录。 true则连同子目录一起删除。flase则不删除目录,并返回 一个异常。
3、Exists 确定给定路径是否引用磁盘上的现有目录。
4、GetAccessControl 已重载。 返回某个目录的 Windows 访问控制列表 (ACL)。
5、GetCreationTime 获取目录的创建日期和时间。
6、GetCreationTimeUtc 获取目录创建的日期和时间,其格式为协调通用时间 (UTC)。
7、GetCurrentDirectory 获取应用程序的当前工作目录。
8、GetDirectories 已重载。 获取指定目录中子目录的名称(字符串数组)。支持用*?通配符匹配符合名称的目录名。 注意,只返回目录名,不返回文件名
9、GetDirectoryRoot 返回指定路径的卷信息、根信息或两者同时返回。
10、GetFiles 已重载。 返回指定目录中的文件的名称(字符串数组)。注意只返回文件名,不返回目录
11、GetFileSystemEntries 已重载。 返回指定目录中所有文件和子目录的名称(字符串数组)。目录名与文件名一起返回。 支持*?通配符检索。
12、GetLastAccessTime 返回上次访问指定文件或目录的日期和时间。
13、GetLastAccessTimeUtc 返回上次访问指定文件或目录的日期和时间,其格式为协调通用时间 (UTC)。
14、GetLastWriteTime 返回上次写入指定文件或目录的日期和时间。
15、GetLastWriteTimeUtc 返回上次写入指定文件或目录的日期和时间,其格式为协调通用时间 (UTC)。
16、GetLogicalDrives 检索此计算机上格式为“<驱动器号>:\”的逻辑驱动器的名称。
17、GetParent 检索指定路径的父目录,包括绝对路径和相对路径。
18、Move 将文件或目录及其内容移到新位置。
19、SetAccessControl 将 DirectorySecurity 对象描述的访问控制列表 (ACL) 项应用于指定的目录。
20、SetCreationTime 为指定的文件或目录设置创建日期和时间。
21、SetCreationTimeUtc 设置指定文件或目录的创建日期和时间,其格式为协调通用时间 (UTC)。
22、SetCurrentDirectory 将应用程序的当前工作目录设置为指定的目录。
23、SetLastAccessTime 设置上次访问指定文件或目录的日期和时间。
24、SetLastAccessTimeUtc 设置上次访问指定文件或目录的日期和时间,其格式为协调通用时间 (UTC)。
25、SetLastWriteTime 设置上次写入目录的日期和时间。
26、SetLastWriteTimeUtc 设置上次写入某个目录的日期和时间,其格式为协调通用时间 (UTC)。
Directory类案例
【文件夹操作 习题】
1、用程序在桌面用程序创建main一个文件夹
2、用程序在main文件里面创建一个subdirectory1文件夹
3、用程序在main文件夹里面创建10个子文件,文件名是随机的。
4、用程序在subdirectory1文件夹里面创建10个子文件,文件名是随机的。
5、获取main里面十个子文件夹名称,并且把它输出到控制台
6、判断main文件是否有子文件subdirectory2,如果没有就新建一个文件夹, 文件夹名称就叫subdirectory2
7、在main文件夹下面创建backUp的文件,然后把subdirectory 移动到backUp里面。
8、获取main文件夹文件名包含 5 的所有文件夹,并且将这些文件名输出到控制台,不包含子文件的里面的文件夹
9、获取main文件夹文件名包含 5 的所有文件夹,并且将这些文件名输出到控制台,包含子文件的里面的文件夹
10、查询main文件夹创建的时间,以及最后的访问日期。并且查询到信息输出到控制台
11、修改main最后的访问日期
12、查询main文件有多少个文件和文件夹(注意区分子目录)
13、查询main文件 的上一级文件夹是谁
14、查询main文件夹的跟目录
15、获取计算机上的所有的分区(比如C盘、D盘)
16、删除子文件backUp
using System.Text; /* * 文件的复制的功能在File类中,所以这边就不再操作了。 * 代码有点长,不过都是片段的,要耐心看哦 * */ //获取当前程序所在的目录,默认以这个目录为当前目录 Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); //将当前目录设置为桌面 Directory.SetCurrentDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)); string path = @"D:\程序开发\vs2022\自定义快捷键\LinNotifyFilter.snippet"; int i = 0; int j = 0; //在桌面新建 main文件夹 Console.WriteLine("1、在桌面新建 main文件夹"); DirectoryInfo main = new DirectoryInfo("main"); if (main.Exists) { Console.WriteLine("main文件已经存在,不再重复创建"); } else { main.Create(); Console.WriteLine(" main创建成功".PadLeft(20)); } //在main文件夹下新建子文件subdirectory Console.WriteLine("2、在main文件夹下新建子文件subdirectory"); DirectoryInfo subdirectory = new(Path.Combine(main.FullName, "subdirectory")); if (subdirectory.Exists) { Console.WriteLine("subdirectory文件已经存在,不再重复创建"); } else { subdirectory.Create(); Console.WriteLine(" subdirectory创建成功".PadLeft(20)); } //subdirectory文件夹下创建10个文件夹,文件名是随机的 Console.WriteLine("3、subdirectory文件夹下创建10个文件夹,文件名是随机的"); if (subdirectory.GetDirectories().Length < 20) { while (i < 10 && subdirectory.GetDirectories().Length < 20) { i++; subdirectory.CreateSubdirectory("sub" + Path.GetRandomFileName()); } } else { Console.WriteLine("子文件已经有20个了,不再创建了"); } //main文件夹 下创建10个文件夹,文件名是随机的 Console.WriteLine("4、main文件夹 下创建10个文件夹,文件名是随机的"); if (main.GetDirectories().Length < 20) { while (j < 10) { j++; main.CreateSubdirectory(Path.GetRandomFileName()); } } else { Console.WriteLine("子文件已经有20个了,不在创建了"); } //获取main里面子文件夹名称,并且把它输出到控制台 Console.WriteLine("5、获取main里面十个子文件夹名称,并且把它输出到控制台:"); DirectoryInfo[] directoryInfos = main.GetDirectories(); foreach (var item in directoryInfos) { // Console.WriteLine(item.Name);这是没有对齐的写法 Console.WriteLine(item.Name.PadLeft(20, ' '));//左对齐 } //判断main文件是否有子文件subdirectory2,如果没有就新建一个文件夹, 文件夹名称就叫subdirectory2 Console.WriteLine("6、获取指定目录下(包含子目录)的文件和子目录,返回类型为FileSystemInfo[],支持通配符查找"); if (main.GetDirectories("subdirectory2").Length == 0) { main.CreateSubdirectory("subdirectory2"); Console.WriteLine($" 创建成功"); } else { Console.WriteLine(" subdirectory2 文件以及存在"); } Console.WriteLine("7、在main文件夹下面创建backUp的文件,然后把subdirectory 移动到backUp里面"); if (main.GetDirectories("backUp").Length == 0) { subdirectory.MoveTo(Path.Combine(subdirectory.Parent.FullName, "backUp")); Console.WriteLine(" 移动成功"); } else { Console.WriteLine(" 移动失败,backUp文件夹已经存在"); } //获取目录(不包含子目录)的子目录,返回类型为DirectoryInfo[],支持通配符查找; Console.WriteLine("6、查找main文件夹下名字包含5的文件(不包含子文件夹)的文件,将文件夹的名称输出到控制台"); foreach (var item in main.EnumerateDirectories("*5*")) { Console.WriteLine(item.Name.PadLeft(20, ' ')); } //获取指定目录下(包含子目录)的文件和子目录,返回类型为FileSystemInfo[],支持通配符查找; Console.WriteLine("8、获取main目录下(包含子目录)的子目录 名字包含5的文件夹名,将文件夹的名称输出到控制台"); foreach (var item in main.EnumerateDirectories("*5*", SearchOption.AllDirectories)) { Console.WriteLine(item.Name.PadLeft(20, ' ')); } //查询 Console.WriteLine($"main文件夹的创建日期:{main.CreationTime}"); Console.WriteLine($"main文件夹的最后访问日期:{main.LastAccessTime}"); main.LastAccessTime = DateTime.Now.AddDays(1);//把最后的访问日期设置为明天 Console.WriteLine($"main文件夹的修改后的最后访问日期:{main.LastAccessTime}"); Console.WriteLine("mian文件之下一共有文件:{0}个,文件:{1}个",main.EnumerateDirectories().Count(),main.GetFiles().Length ); Console.WriteLine("上一级文件夹是:{0}",main.Parent.Name); Console.WriteLine($"main的文件的跟目录:{main.Root}"); Console.WriteLine($"获取计算机上的所有的分区:"); foreach (var item in Directory.GetLogicalDrives()) { Console.WriteLine(item); } Directory.Delete(Path.Combine(main.FullName, "subdirectory2"), true); //程序执行完成后恢复当前目录 Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
using System.IO; using System.Runtime.Loader; namespace IoTest; public class IoTest { static void Main() { //获取当前程序所在的目录,默认以这个目录为当前目录 Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); //更改当前目录,把桌面设置为当前目录,相对路径是基于当前目录的。 Directory.SetCurrentDirectory(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)); //因为已经把桌面设定为当前目录了。所以程序中就可以用相对路径。 string path ="IOTest"; string path1= Path.Combine(path, "temp1"); if (Directory.Exists(path)) { //创建文件夹 DirectoryInfo directoryInfo=Directory.CreateDirectory(path);//如果文件夹不存在则创建文件,如果文件存在就不创建。最后都返回文件的信息 Console.WriteLine("判断新建的文件夹{0}是否存在:{1}",directoryInfo.Name, Directory.Exists(path));//判断新建的文件夹是否存在:True Console.WriteLine("获取刚刚新建文件夹的时间:{0}",Directory.GetCreationTime(path)); Console.WriteLine("获取当前程序的目录:{0}",Directory.GetCurrentDirectory());//获取当前程序的目录:C:\Users\HP\source\repos\IOTest\IOTest\bin\Debug\net6.0 Console.WriteLine("获取上一级目录:{0}", Directory.GetParent(path));//获取上一级目录:C:\Users\HP\Desktop Console.WriteLine("获取目录的根:{0}", Directory.GetDirectoryRoot(path));//获取目录的根:C:\ //移动 string destDirName = Path.Combine(path, "Plugin1"); string sourceName = Path.Combine(path, "temp1"); // Directory.Move(sourceName, destDirName);//创建Plugin1,如果Plugin1文件存在就会引发异常,并且sourceName拷贝过去 //删除 // Directory.Delete(@"C:\Users\HP\Desktop\IOTest\temp1"); //获取文件夹内所有的子文件 string[] Dirs=Directory.GetDirectories(Path.Combine(path, "Plugin1"));//获取子文件夹 string[] files = Directory.GetFiles(Path.Combine(path, "Plugin1"));//获取子文件 string[] files1 = Directory.GetFiles(path, "IOTest*", SearchOption.TopDirectoryOnly);//当前目录获取文件名包含“IOTest”的文件,支持通配符 string[] files2 = Directory.GetFiles(path, "IOTest*", SearchOption.AllDirectories);//获取当前目录和所有子目录以及n层目录文件名包含“IOTest”的文件,支持通配符 //获取文件夹内所有的目录 string[] directory1 = Directory.GetDirectories(path, "Plugin*", SearchOption.TopDirectoryOnly);//当前目录获取目录名字名包含“Plugin”的目录,支持通配符 string[] directory2 = Directory.GetDirectories(path, "Plugin*", SearchOption.AllDirectories);//获取当前目录和所有子目录以及n层目录,目录名包含“Plugin”的目录,支持通配符 //获取FileSystem(file+directory)条目 string[] fileAnddirectory1 = Directory.GetFileSystemEntries(path, "Plugin*", SearchOption.TopDirectoryOnly); string[] fileAnddirectory2 = Directory.GetFileSystemEntries(path, "Plugin*", SearchOption.AllDirectories); //枚举文件加内所有文件目录条码 string docPath1 = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); List<string> dirs = new List<string>(Directory.EnumerateDirectories(docPath1)); //获取操作系统内置文件夹 string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); //设置CurrentDirectory Console.WriteLine(Environment.CurrentDirectory); AssemblyLoadContext ss = new AssemblyLoadContext("sd"); //获取计算机盘符 string[] drivers = Directory.GetLogicalDrives(); //设置创建文件夹的时间 Directory.CreateDirectory(Path.Combine(path, "Test")); Directory.SetCreationTime(Path.Combine(path, "Test"), DateTime.Today.AddDays(7));//设置文件夹创建时间 Console.WriteLine(Directory.GetCreationTime(Path.Combine(path, "Test")));//获取创建文件夹的时间 Console.WriteLine(Directory.GetLastAccessTime(Path.Combine(path, "Test")));//获取文件夹的最后访问时间 //获取目录下的所有文件夹和文件名的路径的条目 string[] allfilesAndDirectory = Directory.GetFileSystemEntries(path); foreach (string file in allfilesAndDirectory) { Console.WriteLine($"allfilesAndDirectory:{file }"); } string[] paths = { @"d:\archives", "2001", "media", "images" }; string fullPath = Path.Combine(paths); Console.WriteLine(fullPath); paths = new string[] { @"d:\archives\", @"2001\", "media", "images" }; fullPath = Path.Combine(paths); Console.WriteLine(fullPath); paths = new string[] { "d:/archives/", "2001/", "media", "images" }; fullPath = Path.Combine(paths); Console.WriteLine(fullPath); //删除temp 临时文件夹 // Directory.Delete(@"IOTest\temp1"); //程序执行完成后恢复当前目录 Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); } } }
绝对路径案例:
using System.IO; using System.Runtime.Loader; namespace IoTest; public class IoTest { public static string getNewDesktopDirectory(string directoryName) { string desstr = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string path = Path.Combine(desstr, directoryName); return path; } static void Main() { string path = getNewDesktopDirectory("IOTest"); string path1= getNewDesktopDirectory(Path.Combine(path, "temp1")); if (Directory.Exists(path)) { //创建文件夹 DirectoryInfo directoryInfo=Directory.CreateDirectory(path);// Console.WriteLine("判断新建的文件夹是否存在:{0}", Directory.Exists(path));//判断新建的文件夹是否存在:True Console.WriteLine("获取刚刚新建文件夹的时间:{0}",Directory.GetCreationTime(path)); Console.WriteLine("获取当前程序的目录:{0}",Directory.GetCurrentDirectory());//获取当前程序的目录:C:\Users\HP\source\repos\IOTest\IOTest\bin\Debug\net6.0 Console.WriteLine("获取上一级目录:{0}", Directory.GetParent(path));//获取上一级目录:C:\Users\HP\Desktop Console.WriteLine("获取目录的根:{0}", Directory.GetDirectoryRoot(path));//获取目录的根:C:\ //移动 string destDirName = Path.Combine(path, "Plugin1"); string sourceName = Path.Combine(path, "temp1"); // Directory.Move(sourceName, destDirName);//创建Plugin1,如果Plugin1文件存在就会引发异常,并且sourceName拷贝过去 //删除 // Directory.Delete(@"C:\Users\HP\Desktop\IOTest\temp1"); //获取文件夹内所有的子文件夹 string[] Dirs=Directory.GetDirectories(Path.Combine(path, "Plugin1"));//获取子文件夹 string[] files = Directory.GetFiles(Path.Combine(path, "Plugin1"));//获取子文件 string[] files1 = Directory.GetFiles(Path.Combine(path, "Plugin1"), "IOTest*", SearchOption.TopDirectoryOnly);//当前目录获取文件名包含“IOTest”的文件,支持通配符 string[] files2 = Directory.GetFiles(Path.Combine(path, "Plugin1"), "IOTest*", SearchOption.AllDirectories);//当前目录和所有子目录获取文件名包含“IOTest”的文件,支持通配符 //获取操作系统内置文件夹 string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); //设置CurrentDirectory Directory.SetCurrentDirectory(path); Console.WriteLine(Environment.CurrentDirectory); AssemblyLoadContext ss = new AssemblyLoadContext("sd"); //获取计算机盘符 string[] drivers = Directory.GetLogicalDrives(); //设置创建文件夹的时间 Directory.CreateDirectory(Path.Combine(path, "Test")); Directory.SetCreationTime(Path.Combine(path, "Test"), DateTime.Today.AddDays(7));//设置文件夹创建时间 Console.WriteLine(Directory.GetCreationTime(Path.Combine(path, "Test")));//获取创建文件夹的时间 Console.WriteLine(Directory.GetLastAccessTime(Path.Combine(path, "Test")));//获取文件夹的最后访问时间 //获取目录下的所有文件夹和文件名完整的路径 string[] allfilesAndDirectory = Directory.GetFileSystemEntries(path); foreach (string file in allfilesAndDirectory) { Console.WriteLine($"allfilesAndDirectory:{file }"); } } } }
Path类
using System.IO;
Path类的静态方法:
ChangeExtension 更改路径字符串的扩展名。
Combine(String()) 将字符串数组组合成一个路径。
Combine(String, String) 将两个字符串组合成一个路径。
Combine(String, String, String) 将三个字符串组合成一个路径。
Combine(String, String, String, String) 将四个字符串组合成一个路径。
GetDirectoryName 返回指定路径字符串的目录信息。
GetExtension 返回指定的路径字符串的扩展名。
GetFileName 返回指定路径字符串的文件名和扩展名。
GetFileNameWithoutExtension 返回不具有扩展名的指定路径字符串的文件名。
GetFullPath 返回指定路径字符串的绝对路径。
GetInvalidFileNameChars 获取包含不允许在文件名中使用的字符的数组。
GetInvalidPathChars 获取包含不允许在路径名中使用的字符的数组。
GetPathRoot 获取指定路径的根目录信息。
GetRandomFileName 返回随机文件夹名或文件名。
GetTempFileName 创建磁盘上唯一命名的零字节的临时文件并返回该文件的完整路径。
GetTempPath 返回当前用户的临时文件夹的路径。
HasExtension 确定路径是否包括文件扩展名。
IsPathRooted 获取指示指定的路径字符串是否包含根的值。
path类操作实例
//1.更改路径字符串的扩展名 string path12 = @"C:\Users\HP\Desktop\IOTest\IOTest.txt"; //更改扩展名,不会改变本地文件的扩展名 string changeExtension = Path.ChangeExtension(path12, ".txb"); Console.WriteLine(changeExtension); //如果 path 不具有扩展名,并且 extension 不是 null,则返回的路径字符串包含 extension,它追加到 path 的结尾。 string s2 = Path.ChangeExtension(@"D:\wang1\wang", ".dll");//返回D:\wang1\wang.dll Console.WriteLine(s2); //2. 合并两个字符路径字符串 Join和combin //join和Combin的区别就是 Combin会丢弃前面不是路径的路径 string path21 = @"C:\Users\HP\Desktop\IOTest"; string path32 = @"C:\Users\HP\Desktop\IOTest\IOTest.txt"; Console.WriteLine(Path.Combine(path21, @"\Plugin"));//\Plugin是相对路径。这样写直接返回相对路径 Console.WriteLine(Path.Join(@"c:\temp.txt", @"\Plugin")); //c:\temp.txt\Plugin Console.WriteLine(Path.Combine(path21, @"Plugin"));//C:\Users\HP\Desktop\IOTest\Plugin Console.WriteLine(Path.Combine(@"c:\temp.txt", @"\subdir\file.txt"));//c:\temp.txt\subdir\file.txt //3.获取指定路径字符串的目录信息 string fileName3 = @"C:\mydir\myfile.ext"; string path3 = @"C:\mydir\"; string rootPath3 = @"C:\"; Console.WriteLine(Path.GetDirectoryName(fileName3));//返回:'C:\mydir' Console.WriteLine(Path.GetDirectoryName(path3)); ;//返回:'C:\mydir' Console.WriteLine(Path.GetDirectoryName(rootPath3)) ;////返回:'' // 4.获取指定路径字符串的扩展名 string fileName4 = @"C:\mydir.old\myfile.ext"; string path4 = @"C:\mydir.old\"; Console.WriteLine(Path.GetExtension(fileName4));//返回 : '.ext' Console.WriteLine(Path.GetExtension(path4));//返回 :'' //5.GetFileName Directory.SetCurrentDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)); string path = @"D:\程序开发\vs2022\自定义快捷键\LinNotifyFilter.snippet"; Console.WriteLine($"获取是否包含根目录:{Path.IsPathRooted(path)}"); if (Path.IsPathRooted(path)) { Console.WriteLine($"获取更目录:{Path.GetPathRoot(path)}"); } Console.WriteLine($"获取目录分隔符:{Path.DirectorySeparatorChar}"); Console.WriteLine($"获取反斜杠:{Path.AltDirectorySeparatorChar}"); Console.WriteLine($"获取盘符:{Path.VolumeSeparatorChar}"); Console.WriteLine($"获取文件名:{Path.GetFileName(path)}"); Console.WriteLine($"获取文件名不带扩展名:{Path.GetFileNameWithoutExtension(path)}"); Console.WriteLine($"是否有扩展名:{Path.HasExtension(path)}"); if (Path.HasExtension(path)) { Console.WriteLine($"获取扩展名:{Path.GetExtension(path)}"); Console.WriteLine($"更改文件扩展名:{Path.ChangeExtension(path, ".txt")}"); } Console.WriteLine($"获取相对地址:{Path.GetRelativePath(@"D:\程序开发", path)}"); Console.WriteLine($"生成随机文件夹名字:{Path.GetRandomFileName()}"); Console.WriteLine($"获取系统随机文件路径:{Path.GetTempPath()}"); Console.WriteLine($"是否完全限定或者UNC:{Path.IsPathFullyQualified(path)}"); //join和Combin的区别就是 Combin回丢弃前面不是路径的路径 Console.WriteLine($"Jion连接文件名:{Path.Join("Path1","Path2",@"\Path3")}"); Console.WriteLine($"Combine连接路径:{Path.Combine(path, "Path2", @"\Path3")}");
注意事项:错误的写法 将两个字符串组合成一个路径Combine(@“c:\sdf”,@"\test") 后面一个如果用相对路径,则返回相对路径\test。如果是目录名字则返回c:\sd\test
C# .NET 获取路径信息
Application.StartupPath
// 获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
Application.ExecutablePath
// 获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
AppDomain.CurrentDomain.BaseDirectory
// 获取基目录,它由程序集冲突解决程序用来探测程序集。
Thread.GetDomain().BaseDirectory
// 获取基目录,它由程序集冲突解决程序用来探测程序集。
Environment.CurrentDirectory
// 获取或设置当前工作目录的完全限定路径。
Directory.GetCurrentDirectory()
// 获取应用程序的当前工作目录。
Assembly.GetExecutingAssembly().Location
// 获取包含清单的已加载文件的路径或 UNC 位置。
通过Request属性获取:
// 获取当前正在执行的服务器应用程序的根目录的物理文件系统路径。
Request.PhysicalApplicationPath;
// E:\解决方案\项目\
// 获取与请求的 URL 相对应的物理文件系统路径。
Request.PhysicalPath;
// E:\\解决方案\项目\zz\zz.aspx
获取虚拟路径和URL信息:(URL:http://localhost/aspnet/zz/zz.aspx/info?name=wk )
// 获取服务器上 ASP.NET 应用程序的虚拟应用程序根路径:/
Request.ApplicationPath;
// /aspnet
// 获取应用程序根的虚拟路径,并通过对应用程序根使用波形符 (~) 表示法使该路径成为相对路径。
Request.AppRelativeCurrentExecutionFilePath;
// ~/zz/zz.aspx
// 获取当前请求的虚拟路径
Request.CurrentExecutionFilePath;
// /aspnet/zz/zz.aspx
Request.FilePath;
// /aspnet/zz/zz.aspx
// 获取CurrentExecutionFilePath属性中指定的文件名的扩展名。
Request.CurrentExecutionFilePathExtension;
// .aspx
// 获取当前请求的虚拟路径(包括附件路径信息)
Request.Path;
// /aspnet/zz/zz.aspx/info
// 获取具有 URL 扩展名的资源的附加路径信息。
Request.PathInfo;
// /info
// 获取有关当前请求的 URL 的信息。
Request.Url;
//http://localhost/aspnet/zz/zz.aspx/inf?name=wk
// 获取当前请求的原始 URL
Request.RawUrl;
// /aspnet/zz/zz.aspx/inf?name=wk
// 获取有关客户端上次请求的 URL 的信息,该请求链接到当前的 URL。
Request.UrlReferrer;
// System.Uri
DirectoryInfo类
static void Main() { //把桌面设置问当前目录变量 Directory.SetCurrentDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)); DirectoryInfo yiNianJi = new DirectoryInfo("yinianji");//一年级 yiNianJi.Create();//创建文件夹 if (yiNianJi.Exists) { //创建子目录 DirectoryInfo yiBan = yiNianJi.CreateSubdirectory("yiban");//一班 DirectoryInfo erBan = yiNianJi.CreateSubdirectory("erban");//二班 DirectoryInfo sanBan = yiNianJi.CreateSubdirectory("sanban");//三班 //属性 Console.WriteLine($"Name:{yiNianJi.Name}"); Console.WriteLine($"FullName:{yiNianJi.FullName}"); Console.WriteLine($"Root:{yiNianJi.Root}"); Console.WriteLine($"Parent:{yiNianJi.Parent}"); ////从目录信息里提取其中的安全访问信息 var directorySever = yiNianJi.GetAccessControl(); //设置文件夹权限 directorySever.AddAccessRule(new FileSystemAccessRule("users", FileSystemRights.FullControl, AccessControlType.Deny)); yiNianJi.SetAccessControl(directorySever); //新建NewTempDir,然后把文件夹下的内容复制到NewTempDir yiNianJi.MoveTo("NewTempDir");//把文件夹下的内容赋值移动到"NewTempDir,并且删除yinianji文件夹,如果已经存在NewTempDir会引发异常 // 获取文件夹下的文件夹和文件 var systeminfo = yiNianJi.GetFileSystemInfos(); var systeminfo1 = yiNianJi.GetFileSystemInfos("sanb*"); }
directorySever.AddAccessRule(new FileSystemAccessRule("users", FileSystemRights.FullControl, AccessControlType.Deny));
"users"是 用户组别
AccessControlType枚举
AccessControlType.Deny 禁止访问
AccessControlType.Allow 允许访问
FileSystemRights 枚举
AppendData:附加数据
ChangePermissions:更改权限
CreateDirectories:创建文件夹/附加数据
CreateFiles:创建文件/写入数据
Delete:删除
DeleteSubdirectoriesAndFiles:删除子文件夹及文件
ExecuteFile:执行文件
FullControl:完全控制
ListDirectory:列出文件夹/读取数据
Modify:修改
Read:读取
ReadAndExecute:读取和执行
ReadAttributes:读取属性
ReadData:读取数据
ReadExtendedAttributes:读取扩展属性
ReadPermissions:读取权限
Synchronize:同步
TakeOwnership:更改文件(夹)所有者
Traverse:执行程序
Write:写入
WriteAttributes:写入属性
WriteData:写入数据
WriteExtendedAttributes:写入扩展属性
注意:
AccessControlType.Deny" 仅在 'windows' 上受支持
FileSystemAccessRule" 仅在 'windows' 上受支持
FileSystemAclExtensions.GetAccessControl(DirectoryInfo)" 仅在 'windows' 上受支持。
FileSystemAclExtensions.GetAccessControl(DirectoryInfo)" 仅在 'windows' 上受支持。
FileSystemSecurity.AddAccessRule(FileSystemAccessRule)" 仅在 'windows' 上受支持。
DriveInfo类
驱动力主要的操作,就是读取 盘的是否准备好、盘类型(u盘、硬盘、磁盘等)、电脑分区、盘大小、剩余空间。
static void Main() { //获取电脑上所有的驱动盘 DriveInfo[] driveInfo = DriveInfo.GetDrives(); foreach (DriveInfo ite in driveInfo) { //输出分区名字 Console.WriteLine($"输出分区名字{ite.Name}"); //判断是不是移动盘 u盘 移动硬盘等 if (ite.DriveType == DriveType.Removable) { Console.WriteLine($"{ite.Name} 是移动盘"); } //分区类型 Console.WriteLine($"分区类型:{ite.DriveType}");//Fixed 固定 //分区格式 Console.WriteLine($"分区格式:{ite.DriveFormat}"); //分区大小 Console.WriteLine($"分区大小:{ite.TotalSize}"); //驱动器上的可用空闲空间总量(以字节为单位) Console.WriteLine($"驱动器上的可用空闲空间总量:{ite.TotalFreeSpace}"); //驱动是否挂载好了 Console.WriteLine($"驱动是否挂载好了:{ite.IsReady}"); //分区标签名字 Console.WriteLine($"分区标签名字:{ite.VolumeLabel}"); Console.WriteLine(); }
枚举 DriveType:
CDRom 5 驱动器是一个光盘设备,如 CD 或 DVD-ROM
Fixed 3 驱动器是一个固定磁盘
Network 4 驱动器是一个网络驱动器
NoRootDirectory 1 驱动器没有根目录
Ram 6 驱动器是一个 RAM 磁盘
Removable 2 驱动器是一个可移动存储设备,如 U 盘
Unknown 0 驱动器类型未知。
File类
File主要操做,Open、append、write、read、copy、movie、replace、create、文件属性的设置
注意事项:1、Encrypt、Decypt 功能不建议在 .NET Core 中使用此 API;windows home 不使用此功能。
2、File.WriteAllLines能写入string[]和IEnumerable<String> ,File.AppendAllLines只能写入IEnumerable<String>
3、File的open方法 要用到FileAccess枚举、FileMode 枚举、FileShare枚举
案例代码
// using System.Text; string appPath = AppDomain.CurrentDomain.BaseDirectory; string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string[] content = { "sfsdfsdf", "sfsfsdfsdfsdf", "sfsdfsdfsfsdf", "sfsfsdfsdfsd" }; string firstline = "=File.Create this is i write first line"; byte[] byteFirstLine = Encoding.UTF8.GetBytes(firstline); if (appPath != desktopPath) { Directory.SetCurrentDirectory(desktopPath); } DirectoryInfo main = new("main"); if (main.Exists) { } else { main.Create(); } string readmetxt = Path.Join(main.FullName, "readme.txt"); //File创建文件 FileStream readme = File.Create(readmetxt); using (readme) { readme.Write(byteFirstLine, 0, byteFirstLine.Length); } //创建或打开用于写入 UTF-8 编码文本的文件。 如果该文件已存在,将覆盖其内容。 StreamWriter swreadme = File.CreateText(readmetxt); using (swreadme) { swreadme.WriteLine("File.CreateText this is i write scond line"); } //append操作 向一个文件中追加行,然后关闭该文件。 File.AppendAllLines(readmetxt, content); File.AppendAllText(readmetxt, "File.AppendText"); //创建一个 StreamWriter,它将 UTF-8 编码文本追加到现有文件或新文件(如果指定文件不存在)。 StreamWriter fileAppendText = File.AppendText(readmetxt); using (fileAppendText) { fileAppendText.WriteLine("fileAppendText"); } //将现有文件复制到新文件。 允许覆盖同名的文件。 string backuptxt = Path.Combine(main.FullName, "backUp.txt"); File.Copy(readmetxt, backuptxt, true); //将现有文件复制到新文件。 不允许覆盖同名的文件 File.Copy(readmetxt, backuptxt, true); // File.Encrypt(@"main\Encypt.txt");不建议在 .NET Core 中使用此 API;windows home 不能使用此功能,所以做演示了 Console.WriteLine(File.GetCreationTime(readmetxt)); Console.WriteLine(File.GetLastAccessTime(readmetxt)); Console.WriteLine(File.GetLastWriteTime(readmetxt)); Console.WriteLine(File.GetAttributes(readmetxt)); //将指定文件移到新位置,提供要指定新文件名的选项。 string backup = Directory.EnumerateDirectories(main.FullName,"backUp").First(); string readmebackupPath = Path.Combine(backup, "readmebackup.txt"); if (!File.Exists(readmebackupPath)) { File.Move(backuptxt, readmebackupPath); //将指定文件移动到新位置,提供指定新文件名和覆盖目标文件(如果它已存在)的选项。 string readmebackup = Path.Join(main.FullName, "backUp\readmebackup.txt"); File.Move(backuptxt, readmebackupPath, true); } /* 这部分代码要一个一个测试 // open操作 zhe File.OpenText(readmetxt); File.Open(backuptxt,FileMode.Append); //File.OpenRead(backuptxt); // File.OpenWrite(backuptxt); // read操作 File.ReadAllBytes(readmetxt); File.ReadAllLines(readmetxt); File.ReadAllText(readmetxt); File.ReadLines(readmetxt); //支持foreach //write 操作 File.WriteAllBytes(backuptxt, byteFirstLine); File.WriteAllLines(backuptxt, content); File.WriteAllText(backuptxt, "File.WriteAllText");// 可写入数组和list<string> 列表 //replace string back2txt = Path.Combine(main.FullName, "back2.txt"); File.Create(back2txt); File.Replace(readmetxt, back2txt, Path.Combine(main.FullName, "back2.txt.bac")); */ File.SetCreationTime(readmetxt, DateTime.Now); File.SetLastAccessTime(readmetxt, DateTime.Now); File.SetLastWriteTime(readmetxt, DateTime.Now);
FileInfo类
fileinfo 没有read、write方法,只有open、creat 、append。主要的文件操作方法在File类中。
fileinfo的open方法 要用到FileAccess枚举、FileMode 枚举
using System.Text; string appPath = AppDomain.CurrentDomain.BaseDirectory; string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string[] content = { "sfsdfsdf", "sfsfsdfsdfsdf", "sfsdfsdfsfsdf", "sfsfsdfsdfsd" }; string firstline = "=File.Create this is i write first line"; byte[] byteFirstLine = Encoding.UTF8.GetBytes(firstline); if (appPath != desktopPath) { Directory.SetCurrentDirectory(desktopPath); } DirectoryInfo main = new("main"); if (main.Exists) { } else { main.Create(); } string readmetxt = Path.Join(main.FullName, "readme.txt"); //creat FileInfo mainFileInfo = new FileInfo(readmetxt); FileStream fs= mainFileInfo.Create(); StreamWriter fs2=mainFileInfo.CreateText(); using (fs) { fs.Write(byteFirstLine, 0, byteFirstLine.Length); } StreamWriter sw= mainFileInfo.AppendText( ); using (sw) { sw.WriteLine("fileInfo.AppendText"); } //appendText StreamWriter appendtext = mainFileInfo.AppendText(); //open FileStream fsOpenRead = mainFileInfo.OpenRead(); FileStream fsOpen = mainFileInfo.Open (FileMode.Open,FileAccess.Read); FileStream fsOpenWrite = mainFileInfo.OpenWrite(); //属性 Console.WriteLine(mainFileInfo.FullName); Console.WriteLine(mainFileInfo.Name); Console.WriteLine(mainFileInfo.Directory); Console.WriteLine(mainFileInfo.DirectoryName); Console.WriteLine(mainFileInfo.Length); Console.WriteLine(mainFileInfo.IsReadOnly); //moveto main.MoveTo("back.txt"); //copyto mainFileInfo.CopyTo("copy.txt"); //repalce mainFileInfo.Replace("readmetxt.txt","sfafaf.txt");
FileStream swFileStream = fileInfo.Open(FileMode.Truncate, FileAccess.Read);
FileMode 模式枚举
一.FileMode.Append
Append追加:
如果文件存在,则打开文件,把指针指到文件的末尾;如果不存在,则新建文件
二.FileMode.Create
Create:新建
如果文件存在,则覆盖原有文件,把指针指到文件的开始,文件的创建日期不会更新;
如果文件不存在,则新建文件
三.FileMode.CreateNew
CreateNew:新建新的文件
如果文件存在,则产生异常;如果文件不存在,则产生异常
四.FileMode.OpenOrCreate
OpenOrCreate:打开或是新建
如果文件存在,则打开文件,把指针指到文件的开始;如果文件不存在,则新建文件
五. FileMode.Truncate
如果文件存在,则打开文件,清除这个文件中的内容,把指针指到文件的开始,保留最初文件的创建日期(重写);如果文件不存在,则产生异常
六. FileMode.Open
Open:打开文件
如果文件存在,则打开文件,把指针指到文件的开始;如果不存在,则产生异常
FileAccess访问枚举
FileAccess用于控制对文件的读访问、写访问或读/写访问的常熟。从源代码可以看到FileAccess是一个简单枚举。
枚举成员 成员值 描述
Read 1 对文件的读访问,拥有读取权限。
Write 2 对文件的写访问,拥有写入权限。
ReadWrite 3 对文件的读访问和写访问,拥有读取和写入权限。
FileShare 枚举(文件读写锁)
FileStream类
File/FileInfo的 Create、Open、OpenWrite、OpenRead会产生 FileStream 。
File/FileInfo的 AppendText、CreateText、OpenText和FIle的WriteAllText 会产生 StreamWriter。