C# 基础知识系列- 14 IO篇 文件的操作 (3)
本篇继续前两篇内容,跟大家介绍一下Path类以及FileSystemInfo这个类的主要方法和属性。
上文提到,在《C# 基础知识系列-IO篇》之文件相关的内容完结之后,会带领大家开发一个小工具-快速检索文件所在目录。
1.3. Path
Path的中文名称有路径的意思,所以Path类就是路径类,C#把Path设置为工具类,路径的实例被区分为文件和目录了。以下是它的定义:
public static class Path
路径是描述文件和目录的位置的字符串,路径并不一定指向硬盘上,换句话说就是路径不一定是物理路径也有可能是虚拟路径或者网络路径。在不同的操作系统和平台上,路径有着不同的表现,所以Path类是对不同平台行为的统一抽象。具体的路径表示需要参照具体的系统表示形式。
那么我们先来看看Path为我们提供了哪些内容,让我们一睹为快:
1.3.1 字段
public static readonly char AltDirectorySeparatorChar;
public static readonly char DirectorySeparatorChar;
这两个是特定系统下的目录分隔符,其中AltDirectorySeparatorChar表示正斜线(/),DirectorySeparatorChar 表示反斜线(\)。为什么说是特定系统下的目录分隔符呢,因为Windows环境对两种分隔符都支持,但是Unix和类Unix系统只支持 / 作为目录分隔符。所以如果系统需要跨平台支持,则最好使用 AltDirectorySeparatorChar作为目录分隔符来使用。
public static readonly char PathSeparator;
这个字段返回在环境变量中分隔路径字符串的平台特定的分隔符。Windows中返回一个分号(;),其他平台可能会有不一样的表现。
public static readonly char VolumeSeparatorChar;
这个表示卷分隔符,是个很有意思的特定。对于Linux系统来说并没有类似于Windows一样的卷,所以该字段会返回一个/ ,而Windows中例如:
D:\Temp\ 这个目录则会返回冒号(:)。
1.3.2 方法
介绍完了字段,我们来看看Path给我们提供了哪些方法吧。
先从最常用的说起吧:
public static string Combine (params string[] paths);
public static string Combine (string path1, string path2);
public static string Combine (string path1, string path2, string path3);
public static string Combine (string path1, string path2, string path3, string path4);
这一组方法用来拼接路径,除第一个参数外,每个参数都应当是相对于之前参数拼接结果路径的相对路径。如果后续出现了绝对路径,那之前计算出的路径信息则会全部抛弃,重新计算。
以下是一个示例:
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);
// Windows系统下的执行结果
// d:\archives\2001\media\images
// d:\archives\2001\media\images
// d:/archives/2001/media\images
//
// 类Unix系统的执行结果
// d:\archives/2001/media/images
// d:\archives\/2001\/media/images
// d:/archives/2001/media/images
继续下一个方法:
public static string GetFullPath (string path, string basePath);
public static string GetFullPath (string path);
获取相对路径的绝对路径,其中 path 是相对路径,basePath是绝对路径。如果指定basePath,则从basePath根据path计算全路径。
public static string GetRelativePath (string relativeTo, string path);
返回从一个路径到另一个路径的相对路径,其中relativeTo是源路径,path为目标路径。其中relativeTo始终是目录,或者被认为是目录。
public static string GetDirectoryName (string path);
返回路径path里的目录信息,例如:"C:\Directory\SubDirectory\test.txt" ,返回"C:\Directory\SubDirectory",如果path是目录,则返回其上级目录的路径字符串。
public static string Join (string path1, string path2, string path3, string path4);
public static string Join (string path1, string path2, string path3);
public static string Join (params string[] paths);
与Combine方法差不多,不过Join方法是把所以参数均按照相对目录来拼接。
说完了目录的一些操作,我们看看Path对文件路径提供了哪些支持:
public static string GetFileName (string path);
获取路径里的文件名,例如说:“C:\mydir\myfile.ext”,返回结果就是“myfile.ext”,也就是说这个方法会返回携带后缀名的文件名。因为文件名本身就包含后缀名。
public static string GetFileNameWithoutExtension (string path);
返回不带后缀名的文件名,与GetFileName类似,但是不好含文件格式后缀。
public static bool HasExtension (string path);
确定是否包含后缀名,也称格式名或者扩展名。
public static string GetExtension (string path);
返回所代表的文件的后缀名。
public static string ChangeExtension (string path, string extension);
修改文件的后缀名。
这些是Path的常用方法,大家有个印象就好。
1.3 FileSystemInfo
文件系统信息,这是FileInfo和DirectoryInfo的两个类的基类,它定义了文件系统中文件和目录共有的一些属性和方法。接下来让我们简单看一看。
先来看一下类的声明:
public abstract class FileSystemInfo : MarshalByRefObject, System.Runtime.Serialization.ISerializable
一个abstract类,这个标记意味着这个类是一个抽象类,抽象类不能直接实例化,所以我们可能不会自己去直接实例化一个FileSystemInfo了。
所以我们先略过FileSystemInfo的构造函数,直接看属性和方法。
public System.IO.FileAttributes Attributes { get; set; }
获取或者设置当前文件或目录的特性,这个特性是一个枚举,而且是一个位标记的枚举类型。
名称 | 值 | 含义 |
---|---|---|
Archive | 32 | 此文件标记为包含在增量备份操作中。 每当修改文件时,Windows 会设置该属性,并且在增量备份期间处理文件时,备份软件应进行清理该属性。 |
Compressed | 2048 | 此文件是压缩文件。 |
Device | 64 | 留待将来使用。 |
Directory | 16 | 此文件是一个目录。 Directory 在 Windows、Linux 和 macOS 上受支持。 |
Encrypted | 16384 | 此文件或目录已加密。 对于文件来说,表示文件中的所有数据都是加密的。 对于目录来说,表示新创建的文件和目录在默认情况下是加密的。 |
Hidden | 2 | 文件是隐藏的,因此没有包括在普通的目录列表中。 Hidden 在 Windows、Linux 和 macOS 上受支持。 |
IntegrityStream | 32768 | 文件或目录包括完整性支持数据。 在此值适用于文件时,文件中的所有数据流具有完整性支持。 此值将应用于一个目录时,所有新文件和子目录在该目录中和默认情况下应包括完整性支持。 |
Normal | 128 | 该文件是没有特殊属性的标准文件。 仅当其单独使用时,此特性才有效。 Normal 在 Windows、Linux 和 macOS 上受支持。 |
NoScrubData | 131072 | 文件或目录从完整性扫描数据中排除。 此值将应用于一个目录时,所有新文件和子目录在该目录中和默认情况下应不包括数据完整性。 |
NotContentIndexed | 8192 | 将不会通过操作系统的内容索引服务来索引此文件。 |
Offline | 4096 | 此文件处于脱机状态, 文件数据不能立即供使用。 |
ReadOnly | 1 | 文件为只读文件。 ReadOnly 在 Windows、Linux 和 macOS 上受支持。 在 Linux 和 macOS 上,更改 ReadOnly 标记是权限操作。 |
ReparsePoint | 1024 | 文件包含一个重新分析点,它是一个与文件或目录关联的用户定义的数据块。 ReparsePoint 在 Windows、Linux 和 macOS 上受支持。 |
SparseFile | 512 | 此文件是稀疏文件。 稀疏文件一般是数据通常为零的大文件。 |
System | 4 | 此文件是系统文件。 即,该文件是操作系统的一部分或者由操作系统以独占方式使用。 |
Temporary | 256 | 文件是临时文件。 临时文件包含当执行应用程序时需要的,但当应用程序完成后不需要的数据。 文件系统尝试将所有数据保存在内存中,而不是将数据刷新回大容量存储,以便可以快速访问。 当临时文件不再需要时,应用程序应立即删除它。 |
通过以下方式进行判断:
FileSystemInfo fsi;
bool isXXX = (fsi.Attributes & FileAttributes.XXX) == FileAttributes.XXX;
public DateTime CreationTime { get; set; }
public DateTime CreationTimeUtc { get; set; }
返回文件/目录的创建时间,其中UTC指协调世界时 。
public string Extension { get; }
获取文件的文件后缀名(扩展名),带点号(.)。
public virtual string FullName { get; }
public abstract string Name { get; }
都是返回文件或目录的名称,不过FullName返回的是全路径名称,Name只返回了文件名。
public DateTime LastAccessTime { get; set; }
public DateTime LastAccessTimeUtc { get; set; }
获取或设置文件最后一次访问的时间,该属性的返回值并不是严格意义上的最后一次访问时间,因为部分系统不会及时更新。
public DateTime LastWriteTime { get; set; }
public DateTime LastWriteTimeUtc { get; set; }
最后一次修改时间,可以自己设置或修改,类似与LastAccessTime,可能不是正确的值。
2. 总结
到目前为止,常用的文件API已经介绍完毕。接下来将为大家演示各种流的使用,以及各种流的操作场景。
更多内容烦请关注我的博客《高先生小屋》
C# 基础知识系列- 14 IO篇 文件的操作 (3)的更多相关文章
- C# 基础知识系列- 14 IO篇 文件的操作
0. 前言 本章节是IO篇的第二集,我们在上一篇中介绍了C#中IO的基本概念和一些基本方法,接下来我们介绍一下操作文件的方法.在编程的世界中,操作文件是一个很重要的技能. 1. 文件.目录和路径 在开 ...
- C# 基础知识系列- 14 IO篇 流的使用
0. 前言 继续之前的C# IO流,在前几篇小短片中我们大概看了下C# 的基础IO也对文件.目录和路径的操作有了一定的了解.这一篇开始,给大家演示一下流的各种操作.以文件流为例,一起来看看如何操作吧. ...
- C# 基础知识系列- 14 IO篇之入门IO
0. 前言 在之前的章节中,大致介绍了C#中的一些基本概念.这篇我们将介绍一下C#的I/O操作,这将也是一个小连续剧.这是第一集,我们先来简单了解一下C#中的I/O框架. 1. 什么是I/O I/O ...
- C# 基础知识系列- 17 实战篇 编写一个小工具(1)
0. 前言 这是对C# 基础系列的一个总结,现在我们利用之前学到的知识做一个小小的工具来给我们使用. 如果有看过IO篇的小伙伴,应该有印象.当时我提过一个场景描述,我们在平时使用系统的时候,经常会为了 ...
- C# 基础知识系列- 15 异常处理篇
0. 前言 为什么我们需要异常处理?什么是异常? 在汉语中,异常指非正常的:不同于平常的.翻译到程序中,就是指会导致程序无法按照既定逻辑运行的意外,或者说是错误.可能会有小伙伴好奇了,我们的程序不是正 ...
- C# 基础知识系列- 16 开发工具篇
0. 前言 这是C# 基础知识系列的最后一个内容讲解篇,下一篇是基础知识-实战篇.这一篇主要讲解一下C#程序的结构和主要编程工具. 1. 工具 工欲善其事必先利其器,在实际动手之前我们先来看看想要编写 ...
- C# 基础知识系列- 3 集合数组
简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案.比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多.很乱.我们对照集合的概念对仓库进行管理的话,那么 ...
- C# 基础知识系列- 17 小工具优化
0. 前言 不知道有没有动手能力强的小伙伴照着上一篇的内容写过程序呢?如果有的话,应该会在使用的时候发现以下几个问题: 每次启动都需要经过漫长的时间去遍历磁盘里的文件目录 因为数据是用的字典保存的,所 ...
- 基础知识系列☞Abstract和Virtual→及相关知识
转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...
随机推荐
- 打造一款 刷Java 知识的小程序(二)
学习Java的神器已上线,面向广大Java爱好者! 之前写的一篇:打造一款 刷Java 知识的小程序(一) 一.第二版做了什么? 第一版小程序只具有初级展示功能,知识点都是hardcode在代码里面的 ...
- AJ学IOS(06)UI之iOS热门游戏_超级猜图
AJ分享,必须精品 先看效果图 思路 需求分析 1,搭建界面 1>上半部分,固定的,用Storyboard直接连线(OK) 2>下半部分,根据题目的变化,不断变化和调整,用代码方式实现比较 ...
- 百度AI开发平台简介
AIstudio https://aistudio.baidu.com/aistudio/index 关于AI Studio AI Studio是基于百度深度学习平台飞桨的一站式AI开发平台,提供在线 ...
- JS Math&Date的方法 (上)
数学对象&时间对象 本篇文章主要介绍Math 和 Date 的常用方法! 一 :Math & Date Math 数学对象 - 处理数学计算和数学类 ...
- Flask接口开发过程中的心得2019.10.03
完善了一下慕课网实战中的post接口开发,得到了一些进步: 代码如下: #coding=utf-8 from flask import Flask from flask import request ...
- PHP函数:fopen
fopen() - 打开文件或者 URL. 注意:array_key_exists() 仅仅搜索第一维的键. 多维数组里嵌套的键不会被搜索到. 说明: fopen ( string $filenam ...
- [YII2.0] 高级模板简单安装教程
YIICHINA官网教程就很完善:http://www.yiichina.com/tutorial/692 但是在yii2框架安装运行init.bat报错php.exe不是内部或外部命令, 解决办法: ...
- Ubuntu16.04 安装eclipse
首先确保自己的Ubuntu已经安装了jdk并且配置好了环境变量 然后在官网下载相应的eclipse安装包: https://www.eclipse.org/downloads/packages/ 下载 ...
- 用asp.net core结合fastdfs打造分布式文件存储系统
最近被安排开发文件存储微服务,要求是能够通过配置来无缝切换我们公司内部研发的文件存储系统,FastDFS,MongDb GridFS,阿里云OSS,腾讯云OSS等.根据任务紧急度暂时先完成了通过配置来 ...
- 0day学习笔记(3)--修改函数返回地址
环境: devc++(编译改为32位),windows10 源码(来自书中) #include <stdio.h> #define PASSWORD "1234567" ...