00:00
我们再来看一个文件编程的应用实例,我们看一个文件编程应用实例呢,这个应用实例就是拷贝一个文件,比如说我们现在呢,需要将一个图片拷贝到另外一个目录下面去,比如说拷贝到哪里去呢?比如说我们要考虑到E盘下面去好吧。E盘,比如说我们拷贝到ABC.jpg假设我们拷贝的一个图片呢,是JPG文件的,当然我能够拷贝一个图片,我就可以拷贝一个什么样的电影。对不对,当然我也可以拷贝一个MP3。这是没问题的,因为他们呢,都是二进制的文件。对不对,好,那怎么样来拷贝一个图片到另外一个目录下面去呢?我们还得这样说啊,如果这个目录不存在。如果这个如果这个文件不存在,就是这个目录下面拷贝到另外一个文件吧。叫文件拷贝到另外另外一个文件,如果这个文件不存在,你还要把这个文件给我创建起来。
01:02
这个就是我们的一个需求。那么在go浪里边,他怎么去拷贝一个文件呢?他在IO包里面提供了一个叫copy的方法,我们来看一下。打开我们的这个手册。在IO包里边。IO包先看一下啊。IO。L包里面呢,我们可以看到里面有有一个函数叫copy。在这里,来看这里。Copy呢,它需要传入这么一个writer和一个reader,大家看一下writer肯定就是写的,也就是说到时间呢,我们要把这个目标。目标文件的writer的内容写入到啊这样子的啊,写错了,是这个reader。这个reader呢是读,就是我把这个原文件里面数据读出来,然后写入到这个DT,这是我们的目标文件。
02:00
那么这个函数我们来看一下,他说将src的数据拷贝到DSDST,如果说发生了一个错误,那么就会截止这个right,大家看这个right written呢,就是一共你操作了多少个字节,对不对?Error呢,就是如果在拷贝的时候我们发生的错误,那么就会返回一个error错误。那这个呢,就是我们进行拷贝文件的一个函数,来我们写一把。我们来完成这个案例。那现在呢,我们讲的是文件编程的应用实力,相对呢来说综合一点。我给他一个标题二。好,现在呢,我们走的第一个案例就是拷贝文件。对吧,我们拷贝文件好的。那给他一个标题三吧。那拷贝文件我们的需求是怎么样子的,大家看一下。
03:00
好的,我们就来完成它啊,完成它注意这个拷贝文件,我先做一个说明,注意啊。注意这个copy文件,Copy函数。Copy函数是IO包提供的。好,这点大家要注意一下,那么我们现在来代码实现一下。现在呢,我们首先先先要准备一个图片。大家看一下,我现在呢,有一个图片已经准备好了。L。大家看看这个flower文件,我先把它放在D盘。我先把它放在D盘好,然后呢,我们发现这里有一个图片叫flower,我待会儿要把这个图片拷贝到E盘下面去。E盘下面去,当然这个E盘呢,现在还没有这个文件,对不对。那待会没有这个文件呢,就会创建一个文件,并把数据写进去,就说相当于通过用go这个程序把flower这个JPG文件拷贝到我们的E盘去,就这意思,文件名你可以随意。
04:09
文件名,你可以随意来吧,我们一起完成它。好,那现在呢,我们再写一个练习。对不对,还写到这吧,叫apply。叫EXE06。那同样道理,我们先把前面这一部分呢,先拷贝一份过来。我写一个文件叫main,点告。好,我们来完成这个案例,那完成一个什么样案例呢?就是将D盘下面的这个叫flower。点JPG这个文件拷贝到E盘下面去,E盘下面这个文件呢,我们就叫ABC.jpg好吧。JPG,好,这是我们的一个具体的需求,那么我们来看一下步骤,第一步。首先我们要围绕哪个地方呢?要围绕这个需求来看,因为它真正完成这个拷贝是用这个函数来完成的,但是他在拷贝的时候呢,需要你提供一个writer和一个reader,是这意思吧,所以说我们干脆呢就写一个函数。
05:16
我们自己写个函数,就是自己编写一个函数。接收。接收什么呢?他接收两个文件。两个。接收两个文件路径。路径那么一个呢,我们叫。叫src。S RC name。就是原文件的名字,这样吧,加个file好吧,另外一个呢,DST。DDST这个发这个就是目标文件,就说我们要把这个文件拷贝到这个目标文件去明白,好,现在我就写了fun,我们叫copy。
06:02
那这里呢,我们接收两个字符串。对不对,一个是他。我们按这个顺序来吧,先把目标文件名写到前面去,再把这个原文件的名字写到这个后面,没问题吧,好,最后呢,我们也像他一样。也跟他这个保持一致,返回一个什么呢?返回一个writer和一个L。如果你需要的话,我也可以把它返回,对不对。好,走完。写完了,那写完过后呢,我们就来完成这个操作,首先。首先我们要先拿到这一个,一个writer和一个ER,对不对,那这个src我们看一下src呢,到时先提供的是一个reader,所以说我们先把它打开,是个reader对不对,是reader,我们把打开,嗯,它要读取它,它要读取它,所以说呢,这里面我们就直接用OS。Open这个把它打开就可以了,打开大家还记不记得这个open会返回一个什么,是不是返回一个文件的文件的这个句柄,对吧?当然也可能有个L。
07:12
好,这个就是我们的原文件的句柄,那么我这做一个判断。如果L它不等于,那说明我们打开这个文件错误了。那我们把这个错误信息输出来。叫做open。Open fire。Open fire。这个error的信息呢,我们输出一下。没问题吧?好,这个就这一步就完成了。那么如果说没有出错,没有出错说明我们把这个句柄就拿到了,对吧,把这个句柄就拿到,那这个时候呢,我们就可以构建一个writer。就通过。这个SR这个句柄获取到。获取到这个reader。因为将来我们要从这个原文件里面读东西嘛,还记,还记不记得这个reader怎么拿到。
08:06
这个reader怎么拿到,是不是通过我们一个buffer这个包,还记得吧,一个buffer IO这个包,这个buffer IO这个包里边呢,它有一个叫六。Reader。记得吧,6READER,好,把这个SR c file放进去。好,我干脆把这个F改成大写的好不好?那这个时候呢,我们会得到一个reader。这个reader到时间呢,我们就可以传进去,传给这个copy函数了,这次拿到这个,我们还有一个东西,同学们,我们还有一个DC,这个呢要得到一个writer。是吧,也是带缓存的一个writer怎么办好,我们同样啊打开。打开这个文件,这个文件路径有可能不存在。就说这个传过来的这个路径,可这个文件名可能不存在,因此呢,我们就不能用o open打开,因为这里面我们还要往里面写,对不对。
09:05
要创建,所以说这时呢,我们要用另外一种方式,大家还记不记得我们在讲这一个前面这个案例的时候,曾经我们讲过这个东西。哪个?是不是这样子打开的open Excel,那么这个时候呢,我们可以用这个读的方式,追加的方式就这样子啊。我们用这个方式。多二坑里往里面写写呢,同时诶还不是这个案例,应该是这个案例吧。对,这个案例就是以写写只写的方式打开,同时呢,如果这个文件不存在,就怎么样,就创建一个,是不是用这个方式方式打开更好一点,对吧。好,我把这一句话呢,就粘贴复制一下。来,朋友们站过来。没问题了,那现在呢,我们把这个路径传进去。传进去,好,他以写的方式打开,同时呢,如果文件不存在,就创建这么一个文件。
10:04
对不对,好,那有了这个地方呢,我们这个文件名我们叫det吧。EST这个也是一个文件句柄,对不对?有了这个文件句柄是不是就可以通过。这个文件句柄来获取,获取到一个什么呀?Writer能理解吗?那获取到这个writer怎么获取呀?老规矩,八份IO点六。六。一个writer。那我们把这个句柄放进去,最后我们就拿到一个writer了。没问题了,这个writer好,到此呢,我们可以看到我们已经拿到了这个reader和一个writer,现在我们只需要一步一个动作,什么动作?拷贝。追。一个什么东西,就是调用。
11:02
这个。IO包里边的这个copy方法。这个是IO包,给我们提供一个真正完成拷贝的方法,大家看一下这个地方是不是。是吧,这个L包拷贝的话,它需要一个writer和一个reader,现在我们已经拿到了,因试调查一下就可以了。一个是。Writer。放进去这个writer跟我们的目标文件关联的,还有一个reader,这个跟我们原文件关联起来的,好了这个就做完了,那做完之后呢,不要忘了,因为我们这个句柄,这两个句柄是打开的,不要忘了怎么样关闭它。关闭它,所以说打开过后呢,我们要及时的关闭,第二。对不对,一份就是HRC。Bose。同样道理,这个writer我们用完了过后,是不是我们也应该把它关闭一下,对不对,所以说有个differ。
12:00
怎么样啊,就是这个DT。点点close。好,大家看到此为止呢,我们这个自个儿写的拷贝文件的函数就写完了,那到时上我们要调用就很简单了,你给我传进来。两个文件的路径就可以了。那我们来完成一下。好,现在我们来调用一下,调用。这一个copy fire完成文件的拷贝。完成文件拷贝,那首先呢,我们来写两个文件,一个src。对不对。这个原原文件的路径就它。没问题吧,然后呢,我要把它写到哪里去呢?DSTL,我要把它写到E盘去。看清楚了。那现在这个D盘这个肯定是存在的,而这个E盘里面的文件不存在,不存在没关系,因为我是以。
13:01
写的方式打开,同时呢,如果不存在,我们就创建这个文件,对不对,所以说现在呢,我们就直接调用就可以了,来点击啊调用copy。然后输入一个dst file。然后src这样可以了。那最后呢,我们再写一句话叫拷贝完成就可以。呃,如果他这个列返回的这个列没有错,是吧,我们可以做一个判断。做一个判断。我只需要。这个错误有没有?没问题吧,我们这样做一个判断,If near。等于二的量。那说明呢,这个就没有错对吧,就写一句话叫做什么呢。拷贝完成print。就是拷贝完成。当然,如果说确实有错误怎么办呢?我们把这个错误信息输出来。PT。
14:00
好,这叫。拷贝错误,拷贝错误信息输出来L。等于百分之,然后把这个L输出来就可以了。好,同学们,那这个关于拷贝文件的应用,我们就说完了,我们来用一用保存一下,大家注意啊,这个地方我们拷贝的是一个文件。是一个图片,图片能够拷贝那其他的文件,比如像。MP3或者是一部电影,我们同样可以完成拷贝,能理解吗?因为他们都是二进制文件,好,我们来完成一下。CD点点CDEX06。第二,我们这写了一个main.go对不对?Go,让面点go抛起来。好,我们可以看到这边有问题啊,有问题我们看看,他说没有定义OS。OS没有定义好的。我把这个OS写进去,还有这两个没有用是吧?这个没有用,Buffer iuo也没有用,所以不要了。
15:07
还有什么?有没有IO?二。这调用了一个copy file I IO,没有写进去。OS也没有写对吧,把它引进去一下。IO。好,我们再来玩一把。拷贝诶,怎么又报错了。On buffer第17行。哦,这地方不能不能把刚才那个删掉了,删多了。八份L带缓存的,因为我们是使用带缓存的reader和writer来完成的。还有哪地方有问题啊?F。对吧。那一样写个F吧。西安。西安。好,这样就可以了吧,跑下。好,拷贝完成,我们看看这个文件有没有顺利的拷贝成功,大家可以看到在E盘呢,已经有个ABC.jpg了,我们打开它看一下。
16:06
没有任何问题,图片是可以的,那同学们注意啊,既然可以拷贝一个图片,我们当然就可拷贝一个视频或者是一个音频文件,对不对?好,这个呢,就是我们拷贝这个文件的一个操作,大家看一下能不能理解,其实说白了很简单。这里面关键点就是我们要拿到一个writer。和一个reader。再调用它系统的函数就可以完成了。那么我们。来看一看IO这个包copy它的源代码是怎么写的,来给大家欣赏一下啊,看看它是怎么写的。那打开我们这个地方呢。呃,文档IO包。IO包里面呢,有个拷贝是这个文件吧,拷贝看它的源代码。同学们可以看到,其实这个拷贝的源代码是在这写的。它这边调用了copy buffer,看到没有,那么copy buffer在哪写着呢,在这它的源代码其实就这里。
17:07
看到没有,如果有兴趣的同学可以去看一下,其实你们有没有发现它是这样写的大题我们可以简单看一下,它有个writer和一个reader。然后这是它的一个buffer对吧,Buffer呢,就是他自己这传的是一个在这传的时候,他传个逆进来就没有没有用没有用,我们这copy没有用到,那他怎么走的呢,大家看。其实并不难。大家看他是大概是这样走的,这有个for循环。它的负循环呢,不停的去读取这个src,就这个reader里面的东西,读一个就通过DAC往里面写,看到没有,读一个写一个,读一个写一个,不停的for循环,就是一边读一边写,一边读一边写,那这样子的话,我们可以单看到,因为它这个copy函数用的是带缓存的,因此呢,我们用这种方式,就是刚才老师写的这个方式来完成拷贝一个大文件也是可以的。
18:04
因为它是带缓存嘛,它是读一点写一点,读一点写一点对不对,所以说这个呢,我们可以看到用这种方式是可以处理这种大文件的,明白。好,那我把这段代码给同学们板述一下。这个就是我们拷贝文件的代码板,述一下放到这里。来放一下。给他插一个表格。跟上思路啊好,关键点就在这里啊,再说一遍,关键点就是调用它。看到没有?那你之所以能够把它调起来,就因为你这个writer和一个reader呢,在前面已经给它构建起来了,对不对,一个是writeer这构建的,一个是reader这构建的,还有不要忘了啊,一定要及时的。把这个打开的句柄怎么样关闭掉。一个是这个句柄,还有一个是这个句柄,别别忘了,因为有时候我们写代码的时候呢,容易忽略掉关闭文件句柄,如果你忽略关闭文件句柄会有什么后果呢?就是说会造成这个内存泄露,那跑一段时间。
19:12
我们这个代码可能就会越来越慢了,因此大家一定要注意这个细节。好,同学们,那关于这个文件编程应用的第一个拷贝文件这个应用案例呢,我们就先给大家介绍到这里,大家可以把这个代码自己去看一看,复习一遍啊,你们可以尝试着拷贝一个电影,或者拷贝一个MP3也是可以的。OK。好,我们这块就先介绍到这里。
我来说两句