`

第三章 文件系统操作

阅读更多

第三章 文件系统操作


 文件路径 (FilePath)


    在tango库中,文件和目录存储单位通常用FilePath实例来描述。
创建一个FilePath很简单,用char[]提供构造器。文件路径不包含ANSI字符,而采用UTF-8编码。如下例:

 


auto path = new FilePath(“name”);


    创建一文件和文件夹需要区分开,创建文件用path.create,创建文件夹用

 

path.createFolder


    重命名一个文件会把它从一个地方移动到另一个地方:


path.rename(”/directory/otherfilename”);


    复制一个文件保留它的原始时间戳:


path.copy("source.name");


    删除一个文件或文件夹用path.remove
    列举文件夹内容用


foreach(name;path.toList)
//do something with the contained file or folder name


有一个另外的低级toList()通过委托进行更强大地控制:


path.toList(void delegate(char[] parent, char[] name,bool isDir) dg );


这个toList()版本会用于构建自定义文件访问器,并且用于#FileScan模块

 

 


FilePath异常

 


    底层操作系统检测到一个错误就抛出一个IO异常。如试图移除一个不存在的或只读的文件将产生一个异常。

 

 

文件管道 (FileConduit)

 

    (注意,文件管道在0.99.8版中已重命名到tango.io.device.File模块,相应的,使用FileConduit的地方改为File)


    文件访问设计意图是通过文件管道(FileConduit)进行操作,提供包括流访问和随机访问文件内容的方法。


    打开一个文件读取内容用如下形式:


auto conduit = new FileConduit(“myFilePath”);


    打开一个文件用于读和写操作需要明确声明文件类型:


auto conduit = new FileConduit(“myFilePath”,FileConduit.WriteCreate);


    有一些预定义类型变体,包括附加(appending)、只读(read-only)、读写(read-write)等等。另外的类型可以被定义,使用一些系统级标记的组合。


    文件管道(FileConduit)使我们可以直接访问未知类型的文件内容。在本例下面这个例子中,我们直接复制一个文件到控制台:


//打开一个文件用于读
auto from = new FileConduit(“test.txt”);
//显示文件内容到控制台
Stdout.stream.copy(from);
现在我们复制一个文件到另一个里边:
//打开一个文件用于读
auto from = new FileConduit(“test.txt”);
//打开另一个文件用于写
auto to = new FileConduit(“copy.txt”,FileConduit.WriteCreate);
//复制文件
to.output.copy(from);
加载一个实体文件到内存,可考虑使用如下形式:
//打开一个文件用于读
auto file = new FileConduit(“test.txt”);
//创建一个数组容纳实体文件
auto content = new char[file.length];
//读取文件内容,返回值是读取的字节数
auto bytesRead = file.input.read(content)
相反,也可以直接写内容到一个文件管道,如下:
//打开个文件用于写
auto to = new FileConduit(“test.txt”,FileConduit.WriteCreate);
//写一个数组内容到该文件
auto bytesWritten = to.output.write(content);


文件管道(FileConduit)同样支持随机IO,在本例中,我们使用seek()重定向文件位置,增加了一点风味,利用一个草案(reader&writer对)进行简单的输入输出类型测定:
//打开一个文件用于读和写
auto file = new FileConduit(“random.bin”,FileConduit.ReadWriteCreate);
//绑定一个草案(protocol)到该管道
auto read = new Reader(file);
auto write = new Writer(file);
int x = 10;
char[] y = “hello”;
//write data,and flush output since protocol IO is buffered
Write(x)(y)();
//重定向到文件开始
File.seek(0);
//重新读回数据
Read(x)(y);

 

 

 

    注意上面的例子中,我们使用了缓冲IO(buffered IO),通过草案(protocol),因而需要在重新确定当前文件位置前冲洗输出。


    当我们不需要更长时间使用时,每个文件管道(FileConduit)应该明确地关闭。为此目的,可以方便地使用一个scope表达式。


auto file = new FileConduit(“myFilePath”);
scope(exit)
File.close;


    大体积文件没有完全地完成或复制操作不完整时,IO异常将被抛出。例如,当使用一个不可用的文件时。

 


文件 (File)

 


    File是一个简单的类,用于读写或再次添加文件内容,例如读取全部文件内容:


auto file = new File(“myfile”);
auto content = file.read();


    基本的文件在调用返回前被关闭。File应该避免假定文件内容,因此,上面的例子返回一个无类型数组。当和文本文件一起工作,它要强制转换返回值去阐述正确的数据类型。文本文件通常转换成一个字符数组(char[]):


auto file = new File(“myfile”);
auto content = cast(char[])file.read();


    转换一个文本文件到一系列行,试试下面的形式:


import Text=tango.text.Util;
auto file = new File(“myfile”);
auto content = cast(char[])file.read();
auto lines = Text.splitLines(content);
使用一个foreach来迭代:
Foreach(line;Text.lines(content))
//针对每一行做某事


    文件可以设置成一个数组的内容:


char[] myText;
file.write(myText);


 文件内容添加用类似的方式:


char[] myText;
file.append(myText);


    以上这些每个方法属于FilePath,通过path方法被展示。因此你能获取文件大小,重新确定文件位置,移除它等等。

 


File异常

 


    底层操作系统或文件系统错误发生时,File 抛出一个IO异常,如尝试写一个只读文件。

 


文件系统 (FileSystem)

 


    这里展示各种文件系统控制,现在文件系统(FileSystem)提供取回和设置当前工作目录和转换一个路径成它的绝对路径形式的便利。访问当前目录名如下操作:


auto name = FileSystem.getDirectory;


    改变当前目录是类似的。
absolutePath方法接受一个FilePath实例,然后转换它到相应的当前工作目录的绝对路径形式,绝对路径形式通常开始于一个路径分隔符,或一个存储标识符,并且不包括’.’或’..’在路径的任何地方。如果提供的路径已经是绝对的,就返回一个未经改变的。

 


FileSystem 异常

 


     取回或设置当前目录失败将抛出一个异常。传递一个无效路径给absolutePath(绝对路径)将产生一个异常。

 


文件根(FileRoots)

 


    文件系统的存储设备显示在这里,在win32平台,根(roots)描述为设备字母,在linux平台,通过/etc/mtab/描述设备定位。列举文件存储设备是可行的:


foreach(name;FilrRoots.list)
//针对每个name做某事


FileRoots 异常


    下层的操作系统或文件系统错误发生时,将抛出一个IO异常。


文件扫描(浏览)(FileScan)


    FileScan模块封装FilePath.toList,以提供更多具体方法。主要的特征是FileScan再次提起文件夹树(folder-trees),并且生成一个容纳文件和文件夹的列表。产生一个D文件和它们所在文件夹的列表的例程如下:


import tango.io.FileScan;
auto scan = new FileScan;
scan(new FilePath(“.”,”.d”);
foreach(folder;scan.folders)
Cout(folder).newline;
foreach(file;scan.files)
Cout(file).newline;


    这个例子执行一次扫描,穿过所有结尾为“.d”的文件,在当前目录开始,一直扩展到所有子目录,每个文件夹包含的文件被显示到控制台,随后形成一个文件名清单。


FileScan有许多方法重载上面那个过分简单化的文件过滤例子,使用委托(delegate):


bool delegate(FilePath path,bool isDir)


    委托的返回值为true就添加实例,否则就排除它。参数isDir指出实例是否是一个文件夹或文件。

 


FileScan异常

 


没有明确的异常抛出

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    王道操作系统思维导图第四章 文件管理

    3. 文件的存储结构:文件可以存储在磁盘上,为了有效管理,文件系统会采用某种存储结构,常见的如连续分配、链接分配和索引分配等。 4. 文件目录和目录结构:文件目录是文件控制块(FCB)的有序集合,用于存放...

    计算机操作系统(第三版|微课版) 第3章习题及答案.docx

    计算机操作系统(第三版|微课版)第3章习题及答案.docx 计算机操作系统是一门基础的计算机科学课程,本章节主要介绍了计算机操作系统的基本概念、组成部分、处理应用程序的步骤、用户与操作系统的接口、系统调用等...

    厦门大学-林子雨-大数据技术基础-第3章 分布式文件系统HDFS-上机练习-熟悉常用的HDFS操作

    "厦门大学-林子雨-大数据技术基础-第3章 分布式文件系统HDFS-上机练习-熟悉常用的HDFS操作" HDFS(Hadoop Distributed File System)是Hadoop生态系统中的核心组件之一,它是基于分布式存储技术的文件系统,旨在...

    操作系统(第4版)第5章 文件系统

    操作系统(第4版)第5章 文件系统 文件系统是操作系统中一个非常重要的组成部分,它负责管理和组织计算机系统中的文件。文件系统的主要功能包括文件存储空间的管理、文件操作的一般管理、目录管理、文件的读/写管理...

    操作系统实验报告(文件管理)

    在操作系统实验报告“文件管理”部分,我们关注的是如何为Unix/Linux系统设计一个简单的二级文件系统。这个实验旨在让学生深入理解文件系统的内部运作机制及其功能实现。以下是该实验涉及的关键知识点: 1. 文件...

    第3章-分布式文件系统HDFS.pdf

    FsImage文件存储了文件系统树以及文件和目录的元数据信息,而EditLog记录了所有的文件创建、删除和重命名等操作。名称节点在内存中保存了文件块到数据节点位置的映射信息,而数据节点负责实际的数据存储,并定期向...

    《计算机操作系统(第四版)》第三章课后习题答案.docx

    本资源摘要信息对应的文件标题是《计算机操作系统(第四版)》第三章课后习题答案.docx。下面将对该文件的内容进行详细的知识点解读和总结。 作业和作业控制块 1. 高级调度的主要任务是根据算法将外存上处于后备...

    操作系统\《操作系统原理教程》电子教案\第4章 文件管理.ppt

    - **文件系统模型**:文件系统是一个包含文件及其属性的软件集合,提供用户接口,并分为三层:最低层处理硬件接口,中间层处理文件的物理组织,最高层提供用户友好的服务。 理解这些基本概念和功能对于深入学习操作...

    操作系统概念第七版10-12章课后题答案(中文版).pdf

    在操作系统中,文件系统的设计和实现对操作系统的性能和安全性产生了至关重要的影响。以下是对操作系统概念第七版10-12章课后题答案的详细解析: 1. 文件系统中的文件删除问题 在文件系统中,当一个文件被删除后,...

    操作系统:第5章 文件系统.pdf

    操作系统中的文件系统是管理和组织计算机中大量数据的关键组成部分。文件系统负责在外部存储设备,如磁盘、磁带、光盘或软盘中,高效、可靠地存储、检索和保护信息。这一章主要涵盖五个核心知识点: 1. **文件和...

    一个操作系统的实现第三章源码

    在"一个操作系统的实现第三章源码"中,我们很可能接触到操作系统设计与实现的细节,特别是通过orange's光盘提供的源码。这个章节可能涵盖操作系统内核、进程管理、内存管理和I/O系统等方面。 首先,操作系统实现的...

    操作系统-第六章 文件系统习题(有答案).pdf

    操作系统中的文件系统是管理和组织计算机数据的核心组成部分。文件系统负责为用户提供方便、高效的数据存取方式,同时也确保数据的安全性和完整性。以下是对题目中涉及的知识点的详细解释: 1. **按名存取**:文件...

    深入理解linux内核(中文第三版) 第18章+Ext2和Ext3文件系统

    Ext2(第二扩展文件系统)和Ext3(第三扩展文件系统)是Linux系统中最早和最常用的文件系统格式之一,对它们的理解有助于深入掌握Linux文件系统的管理和优化。 Ext2文件系统以其高效性和稳定性著称,为Linux系统...

    计算机基础第三章WINDOWS XP操作系统

    **第三章:文件与文件夹的基本操作** 1. **选择**:选中目标文件或文件夹,通常通过单击、多选(Ctrl键加单击)或连续文件(Shift键加单击)实现。 2. **复制与移动**:在"我的电脑"或"资源管理器"中执行,可通过...

    操作系统 第一章 操作系统引论

    3. 设备管理:操作系统负责管理计算机外设,包括缓冲区管理、设备分配和设备驱动等。 4. 文件管理:操作系统负责管理文件的存储和读写操作,包括文件存储空间管理、文件操作的一般管理、目录管理和文件读/写管理等。...

    操作系统原理与实例分析课件第三章

    本课件“操作系统原理与实例分析”专注于第三章的内容,由蒲晓蓉教授指导,旨在深入理解操作系统的核心概念和实际运作机制。 在第三章中,我们通常会探讨以下几个重要的知识点: 1. **进程管理**:进程是操作系统...

    操作系统课件第六章文件管理

    文件系统则是操作系统中用于管理文件信息的机构,包括数据结构(如文件控制块、存储分配表)和管理软件,以及文件操作,如读、写和执行。 文件根据用途、数据形式、操作保护和性质可以分为多种类型。例如,系统文件...

    第三章:Windows 7 操作系统.docx

    按功能划分,操作系统可以分为批处理操作系统、分时操作系统、实时操作系统、嵌入式操作系统、网络操作系统、分布式操作系统等。按用户页面划分,操作系统可以分为命令行用户页面操作系统、图形用户页面操作系统。按...

    2326操作系统yinpin第三章

    3. **文件系统**:操作系统如何组织、存储和检索文件。文件的命名、存储、保护、备份、恢复等都是文件系统的重要内容。可能会介绍FAT、NTFS、EXT等不同的文件系统类型。 4. **I/O管理**:输入/输出操作的处理,包括...

    VC++范例大全光盘源码(第10章 文件操作与注册表编程)

    在第10章的范例中,你可能会看到如何打开、读取、写入、追加以及关闭文件,以及处理文件错误的情况。 接下来,我们将讨论注册表编程。注册表是Windows操作系统用来存储系统和应用程序设置的地方。在VC++中,可以...

Global site tag (gtag.js) - Google Analytics