操作系统课程设计实验报告
实验名称: 复制文件
姓名/学号: 刘赵辰 / 1120181201
一、 实验目的
掌握操作系统当中的文件系统的管理,通过实际操作去了解Windows和Linux两个不同的操作系统对于文件的管理方式的异同。学会在操作系统当中对文件进行管理和修改,熟悉系统API的调用,进一步强化编程实战的能力。在掌握了对于文件的管理之后,还要了解文件本身在系统之中的存储,对于文件的各项属性进行修改,诸如权限和时间等。
二、 实验内容
在Windows和Linux系统当中,通过自己编写的程序,实现对于文件夹的复制。通过在控制台当中获取参数,来将目标文件夹复制到一个新的文件夹当中。要求新文件夹当中所有文件的时间、权限、大小等属性都和源文件的属性是一致的。其中Linux还需要支持软链接的文件复制,Windows当中需要支持快捷方式的文件复制。
三、 实验环境
Windows 10操作系统实现了Windows系统下的实验,代码编写并编译使的IDE是VS 2017。
Linux系统当中的实验使用在Windows系统下使用Vmware 15搭建的虚拟机来实现,系统运行在Ubuntu环境下,使用gcc进行编译。
两个实验均使用C语言进行编写,调用的均是系统的API函数库。
四、 程序设计与实现
Windows系统下的实现:
总体思路:
通过递归调用进行目录复制的函数来实现对于目录的复制,对于目录当中的文件,使用复制文件的函数来进行复制。
实现细节:
首先使用系统API当中自带的结构体WIN32_FIND_DATA来对于文件夹进行遍历。使用FindNextFile去找到每一个文件(目录也是文件)。
然后对于结构体当中的dwFileAttributes进行检查,这个值代表了文件的属性,不同的文件类型会有不同的属性值,如果是16就代表这是一个目录。
如果判断找到的文件是目录,在新的文件夹当中创建一个新的目录,然后递归调用,进入源文件夹的子目录当中继续进行遍历,遍历的形式有点像DFS
如果判断找到的文件当前的文件属性是文件,就调用文件复制的函数,进行文件的复制。
文件复制的函数如下;
同样是利用WIN32_FIND_DATA结构体去存储获取到的文件的信息,然后利用API当中的FindFirstFile函数去找到目录当中的第一个文件。
找到了文件之后,通过文件的句柄对于文件进行操作,利用API当中的ReadFile去对源文件当的文件内容进行获取,然后利用WriteFile将获取到的文件的内容写入到复制的文件当中,这其中对于文件的属性也要进行获取和复制。需要进行获取和复制的文件的属性主要有文件创建的时间,文件修改的时间,文件的权限等属性。
在进行文件和目录的复制的时候,对于属性的修改也是通过API来完成。主要使用的是SetFileAttributes和SetFileTime这两个API。
Windows下实验成功的截图:
Linux系统下的实现:
总体思路:
通过递归调用进行目录复制的函数来实现对于目录的复制,对于目录当中的文件,使用复制文件的函数来进行复制,如果判断文件类型是软链接文件,调用编写的复制软链接的函数。
实现细节:
利用Linux当中的DIR指针去对文件进行读取,用过API当中的readdir函数去遍历目标文件夹,只要不为空就继续。
根据readdir返回的d_type的值来决定读到的是什么类型的文件,如果返回值是4,代表读到的文件是目录,这个时候递归调用复制目录的函数,进入目标子目录继续进行复制。
如果读取到的是软链接类型的文件,就行进行软链接类型文件的复制,复制软链接类型文件的函数如下:
利用readlink找到当前软链接文件链接的对象,然后对该对象创建一个新的软链接。
如果读取到的文件是普通文件,那么直接调用复制普通文件的函数,复制普通文件的函数如下:
首先使用Open去打开文件,如果打开成功的话,利用Linux文件API当中的stat去获取源文件的信息
获取了文件信息之后,利用API当中的read和write函数进行文件内容的读取和写入。
在Linux系统环境下,还需要对文件的时间属性进行单独的设置:
Linux实验成功的结果截图:
五、 实验收获与体会
Windows系统当中,用API里面的句柄去获取到文件的内容,同时需要用FindFirstFile去找到第一个文件,遍历文件夹的时候,需要使用到的又是FindNextFile去进行遍历,而Linux当中,只需要一个DIR指针,就可以指向文件然后完成遍历的操作。
Windows的文件系统对比Linux来说更加的复杂,这里面的复杂主要是体现在操作上面。对于用户来说,对于文件比较在乎的主要是对于文件的权限。在Linux当中,用read函数获取到文件内容之后,再用write函数写入到新文件就可以实现,而在Windows系统当中,需要使用SetFileAttributes函数API去设置文件的属性。从种种细节对比可以看出不同操作系统之间的区别,我想Windows相对繁琐的API和系统操作也决定了它通过一个友好的图形化用户交互界面实现了大部分普通用户的日常使用需求,通过图形化的界面来大大简化了用户的繁琐操作,这也是为什么Windows能够成功的原因吧,而Linux成功的原因在我看来,就是简单而又快捷的指令操作。Windows当中的句柄操作过于繁琐,但是也保证了Windows系统的安全,同时由于提供了各种API,也让开发者有了更多可以操作的余地。
文件系统的存在让文件的管理变得更加的便捷,让用户可以很方便的实现文件的按名查找,同时也让用户能够通过API对文件系统进行操作,实现文件的复制以及属性的更改等操作.