第06章 目录与文件管理

第06章 目录与文件管理
第06章 目录与文件管理

第6章目录与文件管理

目录及文件管理是操作系统的一个重要组成部分,包括目录的创建、移动、删除和文件的创建、移动、复制、删除以及对文件的读写等操作。

一个完整的应用程序,常常会涉及到对系统和用户的信息进行存储、读取和修改等处理。因此,如何有效地实现目录和文件操作也是必须掌握的一种技术。

在C#中,可以方便地对文件进行存储和读写等。.NET框架提供的Directory类和DirectoryInfo类用于对磁盘和目录进行操作管理;File类和FileInfo类用于对文件进行创建、复制、移动、删除和打开等操作。而StreamReader和StreamWriter等类则可以用于对文件以“流”的方式进行读写操作。

6.1 目录管理

在System.IO命名空间中,.NET框架提供了Directory类和DirectoryInfo类。这两个类均可用于对磁盘和目录进行操作管理,如复制、移动、重命名、创建和删除目录,获取和设置与目录的创建、访问及写入操作相关的时间信息。

DirectoryInfo类与Directory类的不同点在于DirectoryInfo类必须被实例化后才能使用,而Directory类则只提供了静态的方法。实际编程中,如果多次使用某个对象,一般用DirectoryInfo类;如果仅执行某一个操作,则使用Directory类提供的静态方法效率更高一些。DirectoryInfo类的构造函数形式如下:

public DirectoryInfo( string path);

参数path表示目录所在的路径。

表6-1和表6-2分别列出了DirectoryInfo类的主要属性及Directory类提供的静态方法。

表6-1 DirectoryInfo类的主要属性

147

第6章目录与文件管理

148表6-2 Directory类提供的静态方法

6.1.1 目录的创建、删除与移动

1.目录的创建

Directory类的CreateDirectory方法用于创建指定路径中的所有目录。方法原型为:

public static DirectoryInfo CreateDirectory (string path)

其中参数path为要创建的目录路径。

如果指定的目录不存在,程序中调用该方法后,系统会按path指定的路径创建所有目录和子目录。例如在C盘根目录下创建一个名为test的目录的代码为:

Directory.CreateDirectory("c:\\test");

使用CreateDirectory方法创建多级子目录时,也可以直接指定路径,例如,同时创建test 目录和其下的t1一级子目录和t2二级子目录的代码为:

Directory.CreateDirectory("c:\\test\\t1\\t2");

2.目录的删除

Directory类的Delete方法用于删除指定的目录,该方法有两种重载的形式:

1) public static void Delete (string path)

参数path为要移除的空目录的名称。path参数不区分大小写,可以是相对于当前工作目录的相对路径,也可以是绝对路径。注意,此目录必须为空才可以删除,否则将会引发异常。

如果希望获取当前工作目录,可使用GetCurrentDirectory方法。

如果在path参数中指定的目录包含文件或子目录,则此方法会引发IOException。

2) public static void Delete (string path, bool recursive)

其中:

path为要移除的目录的名称,不区分大小写;

第6章目录与文件管理

recursive是一个布尔值,若要移除path中的目录、子目录和文件,则为true;否则为false。

例如删除C盘根目录下的test目录,且test目录为空的代码如下:

Directory.Delete("c:\\test");

删除C盘根目录下的test目录,并移除path中的子目录和文件,代码如下:Directory.Delete("c:\\test",true);

【例6-1】创建并删除指定的目录。

using System;

using System.IO;

class Test

{

public static void Main()

{

//指定要操作的目录

string path = @"c:\MyDir";

try

{

//确定目录是否存在

if (Directory.Exists(path))

{

Console.WriteLine("目录已存在");

return;

}

//创建目录

DirectoryInfo di = Directory.CreateDirectory(path);

Console.WriteLine("成功创建目录:{0}", Directory.GetCreationTime(path));

//删除目录

di.Delete();

Console.WriteLine("目录已删除");

}

catch (Exception e)

{

Console.WriteLine("程序异常: {0}", e.ToString());

}

}

}

3.目录的移动

Directory类的Move方法能够重命名或移动目录。方法原型为:

public static void Move (string sourceDirName, string destDirName)

其中:

sourceDirName为要移动的文件或目录的路径;destDirName为指向sourceDirName的新位置的目标路径。

注意,destDirName参数指定的目标路径应为新目录。如将“c:\mydir”移到“c:\public”,并且“c:\public”已存在,则此方法会引发IOException异常。

【例6-2】移动指定的目录,并捕获典型的I/O异常。

using System;

namespace GetFileSystemEntries

{

149

第6章目录与文件管理

150class Class1

{

static void Main(string[] args)

{

Class1 snippets = new Class1();

string path = System.IO.Directory.GetCurrentDirectory();

string filter = "*.exe";

snippets.PrintFileSystemEntries(path);

snippets.PrintFileSystemEntries(path, filter);

snippets.GetLogicalDrives();

snippets.GetParent(path);

snippets.Move("C:\\proof", "C:\\Temp");

}

//显示文件系统目录路径

void PrintFileSystemEntries(string path)

{

try

{

//获取文件系统目录路径

string[] directoryEntries = System.IO.Directory.GetFileSystemEntries(path);

foreach (string str in directoryEntries)

{

System.Console.WriteLine(str);

}

}

catch (ArgumentNullException)

{

System.Console.WriteLine("路径为空引用");

}

catch (System.Security.SecurityException)

{

System.Console.WriteLine("检测到安全性错误");

}

catch (ArgumentException)

{

System.Console.WriteLine("路径是一个零长度字符串");

}

catch (System.IO.DirectoryNotFoundException)

{

System.Console.WriteLine("指定的路径无效");

}

}

//PrintFileSystemEntries方法重载

void PrintFileSystemEntries(string path, string pattern)

{

try

{

//获取文件系统目录路径

string[] directoryEntries =

System.IO.Directory.GetFileSystemEntries(path, pattern);

foreach (string str in directoryEntries)

第6章目录与文件管理{

System.Console.WriteLine(str);

}

}

catch (ArgumentNullException)

{

System.Console.WriteLine("路径为空引用");

}

catch (System.Security.SecurityException)

{

System.Console.WriteLine("检测到安全性错误");

}

catch (ArgumentException)

{

System.Console.WriteLine("路径是一个零长度字符串");

}

catch (System.IO.DirectoryNotFoundException)

{

System.Console.WriteLine("指定的路径无效");

}

}

//显示系统所有逻辑驱动器

void GetLogicalDrives()

{

try

{

string[] drives = System.IO.Directory.GetLogicalDrives();

foreach (string str in drives)

{

System.Console.WriteLine(str);

}

}

catch (System.IO.IOException)

{

System.Console.WriteLine("输入输出异常");

}

catch (System.Security.SecurityException)

{

System.Console.WriteLine("检测到安全性错误");

}

}

//检索指定路径的父目录

void GetParent(string path)

{

try

{

System.IO.DirectoryInfo directoryInfo = System.IO.Directory.GetParent(path);

System.Console.WriteLine(directoryInfo.FullName);

}

catch (ArgumentNullException)

{

151

第6章目录与文件管理

152

System.Console.WriteLine("路径为空引用");

}

catch (ArgumentException)

{

System.Console.WriteLine("路径是一个零长度字符串");

}

}

//移动目录

void Move(string sourcePath, string destinationPath)

{

try

{

System.IO.Directory.Move(sourcePath, destinationPath);

System.Console.WriteLine("移动目录完成");

}

catch (ArgumentNullException)

{

System.Console.WriteLine("路径为空引用");

}

catch (System.Security.SecurityException)

{

System.Console.WriteLine("检测到安全性错误");

}

catch (ArgumentException)

{

System.Console.WriteLine("路径是一个零长度字符串");

}

catch (System.IO.IOException)

{

System.Console.WriteLine("试图将一个目录移到已存在的卷或目标");

}

}

}

}

6.1.2 FolderBrowserDialog控件

VS2005提供了FolderBrowserDialog控件,用于显示用户选择文件夹的对话框。FolderBrowserDialog类属于System.Windows.Forms命名空间,无法继承该类。

调用FolderBrowserDialog类的ShowDialog方法,可以打开对话框,提示用户浏览、创建并最终选择一个文件夹。只能选择文件系统中的文件夹,不能选择虚拟文件夹。只允许用户选择文件夹而非文件。文件夹的浏览通过树控件完成。如果用户在对话框中单击【确定】按钮,则对话框返回结果为DialogResult.OK,否则为DialogResult.Cancel。

表6-3列出了FolderBrowserDialog控件的主要属性。

表6-3 FolderBrowserDialog控件的主要属性

第6章 目录与文件管理

153

表6-4列出了FolderBrowserDialog 控件的主要方法。

表6-4 FolderBrowserDialog 控件的主要成员方法

通常在创建新的FolderBrowserDialog 后,将RootFolder 设置为开始浏览的位置。或者,可将SelectedPath 设置为最初选定的RootFolder 子文件夹的绝对路径。也可以选择设置Description 属性为用户提供附加说明。最后,调用ShowDialog 方法将对话框显示给用户。如果该对话框关闭并且ShowDialog 显示的对话框为DialogResult.OK ,SelectedPath 则是一个包含选定文件夹路径的字符串。

FolderBrowserDialog 是模式对话框,因此,在对话框被显示时,不能对对话框以外的对象进行任何操作,即阻止应用程序其他部分的运行,直到用户选定了文件夹。

【例6-3】单击

Windows 窗体按钮,打开FolderBrowserDialog 对话框。

(1) 启动VS2005,创建一个名为FolderBrowserDialog 的Windows 应用程序项目。

(2) 在Form1.cs 的【设计】窗口中,将Form1的【Text 】属性值改为“FolderBrowserDialog 示例”。打开工具箱,如图6-1所示,在“对话框”选项卡中选择FolderBrowserDialog 控件,将其拖入到Form1窗体中。

(3) 在Form1窗体中,使用工具箱,展开“所有Windows 窗体”选项卡,依次添加标签控件label1、文本框控件textBox1、按钮控件button1,然后修改对应的Text 属性,界面效果

图6-1 工具箱 图6-2 Form1设计窗体

第6章 目录与文件管理

154

如图6-2所示。

(4) 双击【打开文件夹】按钮,添加对应的Click 事件代码:

private void button1_Click(object sender, EventArgs e)

{

DialogResult result = folderBrowserDialog1.ShowDialog();

if (result == DialogResult.OK)

{

textBox1.Text = folderBrowserDialog1.SelectedPath;

}

else

{

textBox1.Text = "";

}

}

(5) 按编译并运行,单击【打开文件夹】按钮,弹出浏览文件夹对话框,如图6-3所示,选择文件夹,单击【确定】按钮,已选择的文件夹就会显示在文本框textBox1中,运行效果如图6-4所示。

6.2 文件管理

File 类和FileInfo 类为FileStream 对象的创建和文件的创建、复制、移动、删除、打开等提供了支持。使用File 类和FileInfo 类对文件进行操作时,用户必须具备相应的权限,如读、写等权限,否则将会引发异常。

FileInfo 类与File 类均能完成对文件的操作,不同点在于FileInfo 类必须被实例化,并且每个FileInfo 的实例必须对应于系统中一个实际存在的文件。由于所有File 类提供的方法都是静态的,所以如果只想执行一个操作,那么使用File 方法的效率比使用相应的FileInfo 实例方法可能更高。如果打算多次重用某个对象,可考虑使用FileInfo 的实例方法,而不是File 类的相应静态方法。

图6-3 浏览文件夹

图6-4 例6-3的运行结果

第6章目录与文件管理

6.2.1 文件复制、删除与移动

File类和FileInfo类属于System.IO命名空间,提供了文件管理操作,本节仅介绍File类。

1.文件复制

File类的Copy方法用于将现有文件复制到新文件。方法原型为:

public static void Copy (string sourceFileName,string destFileName)

其中参数sourceFileName为要复制的文件;destFileName为目标文件的名称,它不能是一个目录或现有文件。

【例6-4】将文件复制到指定路径。

using System;

using System.IO;

class Test

{

public static void Main()

{

string path = @"c:\temp\MyTest.txt";

string path2 = @"c:\temp\MyTest1.txt";

try

{

File.Delete(path2);

File.Copy(path, path2);

Console.WriteLine("{0}复制到{1}", path, path2);

//再次复制相同的文件,操作失败

File.Copy(path, path2);

Console.WriteLine("再次复制相同的文件,操作失败");

}

catch (Exception e)

{

Console.WriteLine("不允许进行二次复制");

Console.WriteLine(e.ToString());

}

}

}

2.文件删除

File类的Delete方法用于删除指定的文件。如果指定的文件不存在,则不引发异常。

方法原型为:

public static void Delete (string path)

参数path为要删除的文件的名称。

【例6-5】删除C:\MyDir目录下的所有文件。

using System;

using System.IO;

class FileTest

{

public static void Main()

{

Console.WriteLine("确定要删除指定目录下的所有文件?");

Console.WriteLine("点击'Y' 键继续,任意键取消");

155

第6章目录与文件管理

156

int a = Console.Read();

if(a == 'Y' || a == 'y')

{

Console.WriteLine("正在删除文件...");

}

else

{

Console.WriteLine("操作被取消");

return;

}

DirectoryInfo dir = new DirectoryInfo(@"C:\MyDir");

foreach (FileInfo f in dir.GetFiles())

{

f.Delete();

}

}

}

值得一提的是,使用File.Delete方法时,文件删除后在Windows的回收站中找不到,但

是使用Norton Unerase Wizard或者其他工具软件却能成功地找到并恢复被删除的文件。由于File.Delete方法并不是彻底地抹去文件的内容,而只是对被删除的文件做出某个标记,因此如果在删除之后没有重新向文件所在的介质中写入新内容,则除了文件名的第一个字符无法恢复外,其它部分都能完整地恢复。

3.文件移动

File类的Move方法用于将指定文件移到新位置,并提供指定新文件名的选项。方法原型为:

public static void Move (string sourceFileName, string destFileName)

参数sourceFileName为要移动的文件名称,destFileName为文件的新路径。

【例6-6】移动一个文件。

using System;

using System.IO;

class Test

{

public static void Main()

{

string path = @"c:\temp\MyTest.txt";

string path2 = @"c:\temp2\MyTest.txt";

try

{

if (!File.Exists(path))

{

FileStream fs = File.Create(path);

fs.Close();

}

if (File.Exists(path2))

{

File.Delete(path2);

}

//移动文件

第6章目录与文件管理File.Move(path, path2);

Console.WriteLine("文件由{0}移动到{1}", path, path2);

//判断文件是否存在

if (File.Exists(path))

{

Console.WriteLine("源文件存在");

}

else

{

Console.WriteLine("源文件不存在");

}

}

catch (Exception e)

{

Console.WriteLine("操作取消: {0}", e.ToString());

}

}

}

6.2.2 文件属性与设置

1.文件属性枚举值

FileAttributes枚举用于获取或设置目录或文件的属性,部分枚举值如表6-5所示。

表6-5 FileAttributes枚举值

对文件的属性FileAttributes进行设置,可以使用File类的SetAttributes方法。方法原型为:public static void SetAttributes (string path, FileAttributes fileAttributes)

参数path为该文件的路径,fileAttributes为所需的FileAttributes枚举值。

3.文件属性的获取

获取指定路径上文件的属性FileAttributes,可以使用File类的GetAttributes方法。

方法原型为:

public static FileAttributes GetAttributes (string path)

参数path为该文件的路径。

【例6-7】设置指定文件的Archive和Hidden属性。

157

第6章目录与文件管理

158using System;

using System.IO;

using System.Text;

class Test

{

public static void Main()

{

string path = @"c:\temp\MyTest.txt";

//如果文件存在,则删除文件。

if (!File.Exists(path))

{

File.Create(path);

}

if ((File.GetAttributes(path) & FileAttributes.Hidden) == FileAttributes.Hidden)

{

//显示文件

File.SetAttributes(path, FileAttributes.Archive);

Console.WriteLine("{0}文件取消隐藏", path);

}

else

{

//隐藏文件

File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Hidden);

Console.WriteLine("{0}文件隐藏", path);

}

}

}

6.2.3 OpenFileDialog控件

OpenFileDialog控件用于显示用户打开文件的对话框。OpenFileDialog类属于System.Windows.Forms命名空间,无法继承该类。

使用此类可检查某个文件是否存在并打开该文件,ShowReadOnly属性确定是否在对话框中显示只读复选框;ReadOnlyChecked属性指示是否选中只读复选框。

调用OpenFileDialog类的ShowDialog方法,可以打开对话框,提示用户打开文件。如果用户在对话框中单击【打开】,则返回结果为DialogResult.OK,否则为DialogResult.Cancel。

【例6-8】单击Windows窗体按钮,打开OpenFileDialog对话框。

(1) 启动VS2005,创建一个名为OpenFileDialog的Windows应用程序项目。

(2) 在Form1.cs的【设计】窗口中,将Form1的【Text】属性值改为“OpenFileDialog示例”。打开工具箱,在“对话框”选项卡中选择OpenFileDialog控件,拖入到Form1窗体中。

(3) 在Form1窗体中,使用工具箱,展开“所有Windows窗体”选项卡,添加按钮控件button1和文本框控件textBox1。

(4) 添加button1的Click事件:

private void button1_Click(object sender, EventArgs e)

{

DialogResult result = openFileDialog1.ShowDialog();

if (result == DialogResult.OK)

{

第6章 目录与文件管理

159

textBox1.Text = openFileDialog1.FileName;

}

else

{

textBox1.Text = "";

}

}

(5) 按键编译并运行,在运行界面中,单击【button1】按钮,弹出“打开”对话框,如图6-5所示,选择某路径下的文件,单击【打开】按钮,打开文件。

6.2.4 SaveFileDialog 控件

SaveFileDialog 控件用于显示用户保存文件的对话框,提示用户选择文件的保存位置。SaveFileDialog 类属于System.Windows.Forms 命名空间,无法继承该类。

使用此类可以打开和改写现有文件,也可以创建新文件。

调用SaveFileDialog 类的ShowDialog 方法,可以打开“另存为”对话框,如图6-6所示,提示用户选择文件的保存位置,并保存文件。如果用户在对话框中单击【保存】按钮,则返回结果为DialogResult.OK ,否则为DialogResult.Cancel 。

6.3 文件的读写

在System.IO 命名空间中提供了多个类,用于进行数据文件和数据流的读写操作。

6.3.1 文件和流

文件(file )和流(stream )既有区别又有联系。文件是在各种媒质上(可移动磁盘、硬盘、光盘等)永久存储的数据的有序集合。它是一种进行数据读写操作的基本对象。通常情况下,文件按照树状目录进行组织,每个文件都有文件名、文件所在路径、创建时间、访问权限等属性。

流是字节序列的抽象概念,例如文件、输入输出设备、内部进程通信管道或者TCP/IP 套接字等均可以看成流。简言之,

流是一种向后备存储器写入字节和从后备存储器读取字节的方

图6-5 打开文件对话框

图6-6 保存文件对话框

第6章目录与文件管理

式。

流也是进行数据读取操作的基本对象,流为我们提供了连续的字节流存储空间。虽然数据实际存储的位置可以不连续,甚至可以分布在多个磁盘上,但我们看到的是封装以后的数据结构,是连续的字节流抽象结构,这和一个文件也可以分布在磁盘上的多个扇区一样。

除了和磁盘文件直接相关的文件流以外,还有多种其它类型的流,例如分布在网络中、内存中和磁带中的流,分别称为网络流、内存流和磁带流。

所有表示流的类都是从抽象基类Stream继承的。

流有如下几种操作:

◆读取:从流中读取数据到变量中。

◆写入:把变量中的数据写入到流中。

◆定位:重新设置流的当前位置,以便随机读写。

File类的静态方法主要是用于创建FileStream类。一个FileStream类的实例实际上代表一个磁盘文件,使用FileStream类可以对文件系统上的文件进行读取、写入、打开和关闭操作,也可以对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。由于FileStream能够对输入输出进行缓冲,因此可以提高系统的性能。

6.3.2 文件的打开

打开指定路径上的FileStream,可以使用File类的Open方法或OpenRead方法或OpenText 方法。利用Open方法打开文件的方式有三种,如表6-6所示。

表6-6 Open方法的重载形式

的内容;FileAccess值指定可以对文件执行的操作;FileShare值指定其他线程所具有的对该文件的访问类型。

6.3.3 文本文件的读写

利用Open方法打开文件后,可以用StreamReader类来读取文件的内容,用StreamWriter 类向文件写入内容,它们提供了按文本模式读写数据的方法。下面示例中用到的OpenText方法是File类的一个静态方法,不能被某个具体的File类的实例调用,它表示从一个已经存在的文本文件中读取一个文本流,并保存在一个StreamReader实例中。

【例6-9】从一个文本文件中读取内容并显示在屏幕上。

using System;

using System.IO;

class FileTest

{

public static void Main()

160

第6章目录与文件管理

{

StreamReader sr;

try

{

sr = File.OpenText("c:\\c#\\file1\\file1.txt");

}

catch

{

Console.WriteLine("文件打开失败");

return;

}

while (sr.Peek()!=-1)

{

String str = sr.ReadLine();

Console.WriteLine (str);

}

Console.WriteLine ("到达文件结尾");

sr.Close();

}

}

【例6-10】向文本文件中写入文本流。

using System;

using System.IO;

class FileTest

{

public static void Main()

{

StreamWriter sw;

try

{

sw = File.CreateText("c:\\c#\\file1\\file2.txt");

}

catch

{

Console.WriteLine("文件创建失败");

return;

}

sw.WriteLine ("网址:");

sw.WriteLine ("https://www.360docs.net/doc/5814466691.html,");

sw.WriteLine ("https://www.360docs.net/doc/5814466691.html,");

sw.WriteLine ("https://www.360docs.net/doc/5814466691.html,/china");

sw.WriteLine ("https://www.360docs.net/doc/5814466691.html,");

sw.Close();

}

}

6.3.4 二进制文件的读写

System.IO还为我们提供了BinaryReader和BinaryWriter类,用于按二进制模式读写文件。它们提供的一些读写方法是对称的,比如针对不同的数据结构,BinaryReader提供了ReadByte、

161

第6章目录与文件管理

ReadBoolean、ReadInt、ReadInt16、ReadDouble、ReadString等方法,而BinaryWriter则提供了WriteByte、WriteBoolean、WriteInt、WriteInt16、WriteDoubleWriteString方法。

【例6-11】将内存中随机产生的二进制数据写入文件,并验证写入结果是否正确。

using System;

using System.IO;

class BinaryRW

{

static void Main()

{

int i = 0;

//创建随机数据写入流

byte[] writeArray = new byte[1000];

new Random().NextBytes(writeArray);

BinaryWriter binWriter = new BinaryWriter(new MemoryStream());

BinaryReader binReader = new BinaryReader(binWriter.BaseStream);

try

{

//将数据写入流

Console.WriteLine("正在写数据…");

for(i = 0; i < writeArray.Length; i++)

{

binWriter.Write(writeArray[i]);

}

//流定位到开始位置

binReader.BaseStream.Position = 0;

//读取流中的数据

for(i = 0; i < writeArray.Length; i++)

{

if(binReader.ReadByte() != writeArray[i])

{

Console.WriteLine("写数据错");

return;

}

}

Console.WriteLine("数据已写入");

}

//捕获EndOfStreamException异常,输出错误信息

catch(EndOfStreamException e)

{

Console.WriteLine("写数据出错\n{0}", e.GetType().Name);

}

}

}

6.4 习题6

1. 简要回答文件和流之间的区别和联系。

2. Directory类为我们提供了哪些目录管理的功能,它们是通过哪些方法来实现的?

3. 编写程序综合应用Directory类的主要方法。首先确定指定的目录是否存在,如果存在,162

第6章目录与文件管理

则删除该目录;如果不存在,则创建该目录。然后,移动此目录,在其中创建一个文件,并对文件进行计数。

4. 编写程序,将文件复制到指定路径,允许改写同名的目标文件。

5. 编写程序,使用File类实现删除当前目录下的所有文件。

163

第六章 文件管理

一、选择题 1、文件系统最基本的目标是(A),她主要通过(B)功能实现的,文件系统所追求的最重要的目标是(C). A,C:(1)按名存取(2)文件共享(3)文件保护(4)提高对文件的存取速度(5)提高I/O速度(6)提高存储空间利用率 B: (1)存储空间管理(2)目录管理(3)文件读写管理(4)文件安全管理 2、在文件系统中可命名的最小数据单位是(A),用户以(B)为单位对文件进行存取、检索等,对文件存 储空间的分配则以(C)为单位。 A,B,C:(1)字符串(2)数据项(3)记录(4)文件(5)文件系统 3、按逻辑结构可把文件分为(A)和(B)两类,UNIX系统中的文件系统采用(B)。 A,B:(1)读、写文件(2)只读文件(3)索引文件(4)链式文件 (5)记录式文件(6)流式文件 4、假定盘块的大小为1KB,对于1.2MB的软盘,FAT需占用(A)的存储空间;对于100MB的硬盘,FAT 需占用(B)的存储空间。 A: (1)1KB (2) 1.5KB (3) 1.8KB (4)2.4KB (5) 3KB B: (1)100KB (2) 150KB (3) 200KB (4) 250KB (5) 300KB 5、从下面的描述中选出一条错误的描述。 (1)一个文件在同一系统着那个、不同的存储介质上的拷贝,应采取同一种物理结构 (2) 文件的逻辑结构不仅与外存的分配方式相关,还与存储介质的特性相关,通常在磁带上只适合 使用顺序结构。 (3)采用顺序结构的文件即适合进行顺序访问,也适合进行随机访问 (4)虽然磁盘是随机访问的设备,但其中的文件也可使用顺序结构 6、从下面的叙述中,选出一条正确的叙述 (1)顺序文件适合于建立在顺序存储设备上,而不适合于建立在磁盘上 (2)显示链接文件将分配给文件的下一个物理块的地址登记在该文件的前一个物理盘块中 (3)顺序文件必须采用连续分配分配方式,而链接文件和索引文件则可采用离散分配方式 (4)在MS-DOS中采用的是隐式链接文件结构 7、从下列叙述中选出两条正确的叙述 (1)在索引文件中,索引表的每个表项中含有相应记录的关键字和该记录的物理地址 (2)对顺序文件进行检索时,首先从FCB中读出文件的第一个盘快号;而对索引文件进行检索时,应先从FCB中读出文件索引表的起始地址。 (3)对一个具有三级索引表的文件,存取一个记录通常需要三次访问磁盘 (4)在文件较大时,无论进行属性存取环视随机存取,通常都以索引文件方式最快 8、在文件系统中可设置一张(A),其中的每一个二进制位可用来表示此案中的一个块的使用情况:另 外可设置一张(B),其中的每个表项存放着文件中下一个盘块的物理地址 A,B: (1)文件描述符表(2)文件分配表(3)文件表(4)空闲区表(5)位示图 9、在下列物理文件中,(A)将使文件顺序访问的速度最快;(B)最不适合对文件随机访问;(C)能直接 记录键值转换成物理地址。 A,B,C:(1)顺序文件(2)隐式链接文件(3)显示链接文件(4)索引文件(5)直接文件 10、文件系统中,必须为每个文件建立一个(A),其中包括有文件名和文件的物理地址等信息。在有些系统中,还为每个文件建立一张(B),其中每个表项包含了逻辑记录号(或记录键)和记录的物理地址A,B:(1)哟会更好文件描述符表(2) 索引结点(3)文件控制块(4)索引表(5)文件目录11、对文件空闲存储空间的管理,在MS-DOS中采用的式(A);UNIX中采用的是(B) A,B:(1)空闲表(2)文件分配表(3)位示图(4)成组链接法 12、在文件系统中是利用(A)来管理文件的,为了允许不同用户的文件使用相同的文件名,通常文件

第六章 文件管理

选择题 1、下列关于索引表的叙述中,正确的是()。 A、建立索引表的目的之一是为了减少存储空间 B、索引表中含有索引文件的数据及其物理地址 C、对索引文件存取时,必须先查找索引表 D、索引表中每个记录的索引项可以有多个 2、一个文件的路径名是从()开始,逐步沿着每一级子目录向下 追溯,最后到指定文件的整个通路上所有子目录名组成的一个字符串。 A、根目录 B、当前目录 C、二级目录 D、多级目录 3、从用户角度看,文件系统主要是实现() A、文件保护 B、文件保密 C、文件共享 D、按名存取 4、文件是具有文件名的一组相关信息的集合,可分为() A、顺序文件和结构文件 B、有结构文件和无结构文件 C、随机文件和结构文件 D、索引文件和结构文件 5、按用途进行划分,文件可分为() A、只执行文件、只读文件、读写文件 B、有结构文件、无结构文件 C、系统文件、用户文件、库文件 D、源文件、目标文件、可执行文件 6、()具有将文件名转换为该文件在外存的物理位置的功能,这 也正是文件目录所提供的最基本的功能。 A、文件目录 B、一级目录 C、二级目录 D、树型目录

7、为能对一个文件进行正确的存取,必须为文件设置用于描述和 控制文件的数据结构,称之为() A、文件逻辑结构 B、文件物理结构 C、文件的属性 D、文件控制块(FCB) 8、文件信息的逻辑块号到物理块号的变换方法是由文件的()决 定的 A、逻辑结构 B、顺序结构 C、物理结构 D、索引结构 9、为了防止各种意外破坏文件,文件系统可以采用()的方法来 保护文件 A、口令和加密 B、对每个文件规定使用权限 C、建立副本和定时转储 D、为文件设置口令 10、文件保密主要有两种方式: A、口令方式和密码方式 B、隐藏方式和备份方式 C、规定权限和备份 D、口令和规定权限 11、下面关于存储介质的有关廉洁中正确的是()。 A、“卷”和“块”是存储介质的不同单位。卷是保存文件的存储介质的物理单位,而块是存储介质上连续信息的区域,是存储设备和主存储器之间信息交换的单位。 B、存储分块越小越好,分块越小存储介质的利用率越高。 C、存储介质和存储设备是同一物理实体的两种说法,都是指用以记录信息的物理实体。 D、存储介质是指用来记录信息的磁带、硬磁盘组、软磁盘片和卡片

第6章 文件管理

第21 次课教案

第6章文件管理 在一个计算机系统中除了包含如内存、中央处理器和各种各样的输入输出设备等硬件资源外,还有一些更重要的资源,即软件资源。它主要包括系统程序(如编译程序、汇编程序等)、标准库函数以及大量的应用程序等。 对于这些软件资源,从管理者的角度来看,把它们看成一个个的文件,并把它们保存在某种介质上。操作系统本身就是一个很重要的软件资源,对于操作系统只有某部分的内容常驻内存,其它大部分的操作系统程序存放在磁盘上,当需要用到某部分内容时,才将其装入内存。此外,在计算机系统中将要安装各种应用软件,内存的空间是有限的并且不能长期保存,所以通常都是将它们保存在外存上,需要时再调入内存。因此,为了便于管理,操作系统中提供了文件管理功能,这样不仅方便了用户,而且还可以提高资源的利用率。 文件系统是操作系统中对文件进行控制和管理的模块,也是操作系统中不可缺少的部分,本章将介绍文件、文件系统、文件的存储和检索以及共享和保护等问题。 6.1 文件和文件系统 一、文件 文件是在逻辑上具有完整意义的信息的集合,它以文件名作为唯一标识。 文件名以字符串的形式描述。不同的操作系统对文件名有不同的规定,有些系统采用扩展名表示文件的属性和类型,文件名与扩展名之间用“.”分隔,例如在DOS中使用扩展名.exe 表示该文件为二进制可执行文件;有些系统通过修改文件属性描述文件的类型,而不支持扩展名,如Linux中“.”只是一个字符,该字符之后的所有字符也被认为是文件名的一部分,不能以此识别文件类型,文件类型要通过文件属性来描述,在这点上DOS和Linux不同。 文件属性通常包括:⑴文件名,文件的唯一标识,由用户按规定取名。⑵文件类型,标志该文件的类型,如可执行文件、源文件等。⑶文件长度,文件的大小。⑷文件的位置,文件在设备上存放位置的地址。⑸文件的存取控制,文件的存取权限,如可读、可写、可执行等。⑹日期和时间:文件的创建、修改和访问的时间和日期。 二、文件类型 文件分类主要是为了便于系统对不同的文件进行不同的管理,从而提高处理速度,便于保护和共享。 ⒈按用途分类 ⑴系统文件:支持操作系统实现其基本功能的文件。这类文件用户不能直接调用,只能由系统程序调用为用户服务。 ⑵库文件:由标准子程序及若干应用程序组成。这类文件允许用户直接调用,但不允许

第六章 文件管理

1、存放在某个磁盘上的文件系统采用混合索引分配方式,其 FCB中共有13个地址项,第0—9个地址项是直接地址,第10 个地址是一次间接地址,第11个地址是二次间接地址,第12个 是三次间接地址,如果每个盘块大小为512字节,若盘块号需要 3个字节来描述,而每个盘块最多存放170个盘块地址,则: (1)该文件系统允许文件的最大长度是多少? (2)将文件的字节偏移量5000,15000,150000转换为物理块号和块内偏移量 (3)假设某个文件的FCB已在内存,但其他信息均在外存,为了访问该文件中某个位置的内容,最少需要几次访问磁盘?最多 需要几次访问磁盘? 2、假定盘块的大小为1KB,硬盘的大小为500MB,采用显示链 接分配方式时,其FAT占用多少存储空间?如果文件A占用硬 盘的第11、12、16、14四个盘块,试画出文件A中各盘块间的 链接情况及FAT的情况(注:fat表项一般为半个字节的整数倍)。 3、请分别解释在连续分配方式、隐式链接分配方式、显示链接分 配方式和索引分配方式中如何将文件的字节偏移量3500转换为 物理块号和块内偏移(设盘块的大小为1KB,盘块号占4个字节)。 4、一个UNIX文件F的存取权限为:rwxr-x---,该文件的文件 主uid=2,gid=1,另一个用户的uid=6,gid=1,是否允许该用户读文件 F。 5、假设一个文件系统中,物理块的大小为512B;FCB占用48个字节

如果把FCB分解成两部分;符号目录占8字节(其中文件名占6字节,in 号占用2字节),基本目录inode占用48-6=42字节,试求不分解FCB和解FCB时,查找一个文件的平均访盘次数(假设一个目录文件有128 FCB)。 分解前:一块可以存放FCB:512/48=10 128个FCB要多少块存放:128/10=13 平均访盘时间:(13+1)/2=7 分解后:一块可以存放文件目录:512/8=64 128个FCB需要128/64=2块来存放 平均访盘时间:(2+1)/2+1=2.5 6、一个文件系统基于索引节点组织方式,假设物理块长512B。 (1)文件名目录每个表项占16B,文件目录从物理块111号开始存放。 (2)索引节点占64B,索引节点区从物理块2号开始存放。 (3)假设索引节点编号从1到某个最大值,现有文件file为顺序文件,file位于文件目录的第34个目录项中,它对应的索引 节点号为64. 为打开文件file需要几次启动磁盘?每次所读的物理块号是多 少? 每块存放的目录表项个数:512/16=32 每块存放的索引节点个数:512/64=8

第六章 文件管理

第六章文件管理 一、单项选择题 1.记录的成组与分解操作不仅提高()的利用率,而且可减少对存储设备的启动次数。 A.主存空间B.存储介质 C.处理器D.共享文件 2.用户要求把一个新文件存放到存储介质上时,首先要使用()文件操作,目的是让系统做好存储文件前的准备工作。 A.打开B.建立 C.关闭D.删除 3.磁盘上的每一个物理块要用三个参数来定位,首先要把移动臂移动并定位到不同盘面上具有相同编号的磁道位置,表示该位置的参数称()号。 A.柱面B.盘面 C.扇区D.磁头 4.把逻辑文件存放到存储介质上时,如果组织成()文件,则逻辑记录可以按任意次序存放在不相邻的存储块中。 A.流式B.记录式 C.顺序D.链接 5.为了保证存取文件的可靠性,用户要求读一个文件前应首先请求系统执行()文件操作。 A.打开B.建立 C.关闭D.删除 6.索引文件的最佳存取方法是: A. 随机存取法 B. 顺序存取法 C. 按键存取法 D. 成组 存取法 7.逻辑记录的顺序与文件实际占用盘块的顺序一致的物理文件是:A.连续文件B.串联文件C.索引文件D.链接文件 8.下列选项中,哪个不是按文件的组织形式划分的文件类型: A.普通文件 B. 系统文件 C. 目录文件 D. 特殊文件 9.下列选项中,不是按文件的性质和用途分类的文件类型是() A. 源文件 B. 系统文件 C. 用户文件 D. 库文件 10.同一文件被存放到不同的存储介质上时,()的组织形式。 A.应该有相同 B.不能有相同

C.可以有不同 D.只能用不同 11.用于管理学生成绩的逻辑文件的组织形式应该采用()文件较合适。 A.记录式 B.流式 C.连续 D.顺序 12.对磁盘进行旋转调度的目的是为了缩短()时间。 A.启动 B.寻找 C.传送 D.延迟 二、多项选择题 1.采用多级目录结构,对命名文件允许()。 A.不同用户用相同名字B.不同用户用不同名字 C.同一用户在自己的不同子目录中用相同名字 D.同一用户在同一子目录中用相同名字E.同一用户用不同名字 2.物理文件有()。 A.连续文件B.链接文件C.索引文件 D.索引顺序文件E.记录式文件 3.文件的逻辑结构有()类型 A.顺序式B.流式 C.链接式D.记录式 E.索引式 三、填空 1.文件系统模型中,最高层是。2.从用户观点出发所观察到的文件组织形式称作文件 的。 3.__________是指避免文件拥有者或其他用户因有意或无意的错误操作使文件受到破坏 4.活动头磁盘的访问时间包括________ __________ ___________ 5.文件转储的方法有两种:____________,____________ 四、简答 解释什么是逻辑文件和物理文件,它们各有哪些基本形式? 什么叫文件目录?文件目录中应包含哪些基本内容?

第六章-文件管理

第六章文件管理 一、文件管理的基本概念 1、文件 (1)定义 1)文件:是信息的一种组织形式,是存放于外存上的具有文件名的一组相关信息(记录)的集合。 2)记录:一组相关数据项的集合,用来描述数据对象某方面的属性。 记录是文件中数据处理的基本单位,是组成元素的基本元素。 3)数据项:指描述一个对象的某种属性的字符集,是数据处理的最小单位。 4)关键字:是数据项中一个项或几个项的集合,能唯一标识一个记录的数据项。 (2)访问单位:位、字节、记录 (3)组成:文件控制块(文件说明)、文件体 (4)属性:①文件类型②文件长度③文件的物理位置④文件的存取控制⑤文件的建立时间 (5)特点:①保存性②按名存取③内容是一组信息的集合 2、文件系统 (1)定义:操作系统中与管理文件有关的软件和数据,是操作系统的重要组成部分。 *文件在文件系统中是一个最大的数据单位,它描述了一个对象集。 (2)构成:①管理文件所需的数据结构②相应的管理软件③被管理的文件 (3)主要目标:提高存储空间的利用率。 (4)功能:①实现文件名到物理地址的映射(最基本):从用户角度看即按名存取,需要建立文件目录来实现。 ②实现文件和目录的管理:。 ③完成文件存储空间的管理:把存储器分成若干个大小相等的物理块并以块为单位进行信息交换。 针对可改写的外存(如磁盘)进行分配和回收等。 ④实现文件共享和安全措施 ⑤提供有好的用户接口:命令接口和程序接口。 ⑥提供文件操作:打开、关闭、读写等操作。 2、文件类型 (1)按性质和用途分类:①系统文件 ②用户文件 ③库文件 (2)按数据形式分类:①源文件 ②目标文件 ③可执行文件 (3)按存取控制属性分类:①执行文件 ②只读文件 ③读写文件 (4)按信息流向分类:①输入文件:卡片阅读机或键盘上的文件 ②输出文件:打印机上的文件 ③输入输出文件:键盘、磁带上的文件 (5)按逻辑结构分类:①有结构文件(记录式文件) ②无结构文件(流式文件) (6)按物理结构分类:①顺序文件 ②链接文件 ③索引文件 (7)按文件内容分类:①普通文件 ②目录文件 ③特殊文件 二、文件的结构(组织形式)与存取方式 1、文件的逻辑结构(逻辑组织) (1)定义:从用户的观点出发,所观察到的文件组织形式,是用户可以直接处理的数据及其结构,它与存储设备特性无关。

第六章,文件管理

第六章文件管理 1.文件管理应具有文件存取空间的管理,目录管理,文件的读/写管理,文件的共享和保护。 2.文件按逻辑结构可分成字符流式和记录式两种类型,现代操作系统(如UNIX)普遍采用的是其中的字符流式。 3.记录式文件把数据的组织分成数据项,记录和文件三级。 4.数据项是用来描述一个实体的某个属性;记录式用来描述一个实体的某方面(相对完整)的属性;文件用于描述一个实体集(即群体)的某方面的属性。 5.一个文件系统模型由最低层的对象及其属性,中间层的对对象进行操作和管理的软件集合和最高层用户接口三个层次组成。 6.对文件的访问有顺序访问和随机访问两种方式。 7.文件的物理结构主要有顺序结构,链接结构和索引结构三种类型,其中顺序访问效率最高的是顺序结构,随机访问效率最高的是索引结构。 8.可将顺序文件中的文件内容转入到连续的多个盘块中,此时,文件目录项的地址部分给出的是文件的首个物理块的块号。问了访问到文件所有内容,目录项中还必须有文件长度。 9.可将链接式文件中的文件内容装入到离散的多个盘块中,并通过链接指针将它们构成一个队列,显示链接文件具有较高的检索速度。 10.对于字符流式文件,可将索引文件中的文件内容装入离散的多个盘块中,并为每个文件建立一张索引表,其中每个表项都含有逻辑块号和对应的物理块块号。 11.在利用空间链表来管理外存空间时,可有两种方式:一种以空间盘块为单位拉成一条链;另一种以空闲盘区为单位拉成一条链。 12.从文件管理的角度来看,文件时由文件控制块PCB和文件体两部分组成的;而在具体实现时,前者的信息通常以目录项和磁盘索引节点的方式存放在文件存储器上。 13.文件目录的最主要的功能是实现按名存取(文件名到物理地址的转换),故目录项的内容至少包含文件名和文件的物理地址。 14.在成组链接法中,将每一组的盘块数和该组的所有的盘块号记入前一组

相关主题
相关文档
最新文档