操作系统Windows【实验】文件复制
操作系统课程设计实验报告
实验名称: 复制文件
姓名/学号: 刘赵辰 / 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对文件系统进行操作,实现文件的复制以及属性的更改等操作.
操作系统Windows【实验】文件复制相关推荐
- windows服务器文件复制脚本
@echo off::被复制的源文件夹 set sourceDir=E:\sdssqlmkdir E:\inter set tarDir=E:\inter::/EXCLUDE:uncopy.txt 排 ...
- 如何在 Windows 7 中使用多线程加快文件复制[转]
为什么没办法在 Windows 7 下加快 Windows 7 中文件复制/传输功能呢?可以用 robocopy 实现多线程文件复制实现. 经常进行文件管理操作的朋友们,提到复制/粘贴操作,想必很多人 ...
- 从服务器上复制文件是出错,对Windows Server文件拷贝错误的排错 | 挨踢茶馆
有的时候向Windows Server共享拷贝大文件会出现错误.Performance Monitor或者PowerShell命令可以帮助你找到并且修复这些文件拷贝的错误. Server Messag ...
- linux复制压缩文件夹,[操作系统]linux中文件或者文件夹的基本操作(复制,移动,删除,查找,压缩)...
[操作系统]linux中文件或者文件夹的基本操作(复制,移动,删除,查找,压缩) 0 2015-12-28 00:00:15 linux 文件(文件夹)的创建,复制,移动,重命名,删除基本命令 复制文 ...
- Windows直接拖拽文件复制到虚拟机Ubuntu
一.背景 众所周知大多新手是通过虚拟机接触ROS系统,因此一般电脑都是安装的 Windows 系统,只有使用ROS的时候才会打开虚拟机运行ubuntu,所以学习的过程中会经常在 Windows和 Ub ...
- 服务器系统c盘在哪个文件夹,windows操作系统放在哪个文件夹下
2010-05-22 回答 windows文件夹下的文件名解释 一.文件夹篇 all users 这里记录的是window的用户以及这些用户个人设定的开始菜单及桌面等信息. command 在这个目录 ...
- 通过网络共享将 Windows 10 的文件复制到 iPhone 手机上
在 Windows 10 电脑上按快捷键 Win + R 在出来的 运行 窗口中输入 cmd 在出来的cmd命令行窗口输入 ipconfig ,找到自己电脑的ip地址 1902.168.1.105 首 ...
- 实现Windows文件复制到vm虚拟机
实现Windows文件复制到vm虚拟机 听说可以直接把Windows里的文件拖到虚拟机里??纳尼??(⊙o⊙)? 居然有这么骚的操作,那我一定得试试: 先打开虚拟机,切换到我的目标文件夹,然后找到想要 ...
- 怎么才能把windows里的文件复制到虚拟机的linux中去
进入你的虚拟机中,然后,右击你的虚拟机的标签,选择设置-->options选项卡中有一个"共享文件夹"用鼠标选中它,再在右边窗口中,点添加按钮,再在你的linux系统中作如下 ...
最新文章
- Learn Jenkins the hard way (0) - Jenkins的罪与罚
- 关于javascript闭包中的this对象
- cdrx4自动排版步骤_现在的大学生,都不会论文排版了
- python sklearn.datasets.fetch_mldata MNIST手写数字数据集无法获取, 报错 Function fetch_mldata is deprecated 的解决办法
- 太牛了!芯片级拆解世界第一颗FPGA芯片!
- html、sqlserver、java基础总结
- Linux 安装 lanmp
- 叮叮叮 重点之中的python必备英语单词(1)来啦!请记得查收
- hive 如何将数组转成字符串_Hive函数大全(含例子)之字符串函数(String Functions)...
- console连接h3c s5500_h3c console连接方法
- grep命令_「Linux」- ps -ef |grep 命令
- WIFI系列协议--802.11ac--增强非常高吞吐量简称VHT--1Gbit
- Object.entries() 的使用
- 10019---JavaWeb基础--EL
- python正则表达式提取文本中的电话号码和邮箱
- 用Socket实现点对点的文件传输
- 双网卡的网络路由配置
- Ubuntu子系统上安装miniconda.sh 438、444报错
- oracle 数据跟踪软件,oracle数据库跟踪工具
- 监督学习和无监督学习概念