问题描述
今天看到一个用来进行文件复制的程序。如下。publicvoidCopyFile(stringFromFile,stringToFile,intsectSize){//建立文件,若文件存在则覆盖FileStreamfileToCreate=newFileStream(ToFile,FileMode.Create);fileToCreate.Close();fileToCreate.Dispose();//获得源文件和目的文件的文件流FileStreamfromFileStream=newFileStream(FromFile,FileMode.Open,FileAccess.Read);FileStreamtoFileStream=newFileStream(ToFile,FileMode.Append,FileAccess.Write);intFileSize;if(sectSize<fromFileStream.Length){byte[]buffer=newbyte[sectSize];intcopied=0;while(copied<=((int)fromFileStream.Length-sectSize)){FileSize=fromFileStream.Read(buffer,0,sectSize);fromFileStream.Flush();toFileStream.Write(buffer,0,sectSize);toFileStream.Flush();toFileStream.Position=fromFileStream.Position;copied+=FileSize;}intleft=(int)fromFileStream.Length-copied;FileSize=fromFileStream.Read(buffer,0,left);fromFileStream.Flush();toFileStream.Write(buffer,0,FileSize);toFileStream.Flush();}else{byte[]buffer=newbyte[(int)fromFileStream.Length];FileSize=fromFileStream.Read(buffer,0,(int)fromFileStream.Length);fromFileStream.Flush();toFileStream.Write(buffer,0,FileSize);toFileStream.Flush();}}
有两点我不是很理解:(1)为什么建立文件,要先建立之后然后关闭,然后再以Append的方式打开呢?似乎有更简单的方法吧?(2)while循环内的那些代码,也太繁琐的吧。我不太熟悉这些操作,在vs上实验了一下。实在是弄不懂为什么作者把代码写的这么“严谨”。难道如果不这样写的话,会有隐患吗?
解决方案
解决方案二:
用一个CopyFile就行??
解决方案三:
File.Copy(),这一个方法就行,在命名空间System.IO里
解决方案四:
stringOrignFile,NewFile;File.Copy(OrignFile,NewFile,true);FileStream复制大文件.即每次复制文件的一小段,以节省总内存开销
解决方案五:
真的没必要
解决方案六:
(1)为什么要先建立文件,然后关闭,然后再以Append的方式打开呢?直接在建立的文件流中写入不就可以了(2)while循环内的那些代码,每次都使用Flush和toFileStream.Position=fromFileStream.Position;我不太熟悉这些操作,在vs上实验了一下。实在是弄不懂为什么作者把代码写的这么“严谨”。难道如果不这样写的话,会有隐患吗?
解决方案七:
嗯我也在纠结这个问题,不过要复制大文件时用得着。若是比较小的文件就没必要那么复杂了
解决方案八:
先引入:Microsoft.VisualBasic这个最简单,在大文件也可以复制Microsoft.VisualBasic.Devices.ComputerMyComputer=newMicrosoft.VisualBasic.Devices.Computer();MyComputer.FileSystem.CopyFile("E:\Downloads\TheSorcererandtheWhiteSnake2011BluRayREMUX1080pAVCDTS-HDMA5.1DD5.1-CHD.ts","c:\TheSorcererandtheWhiteSnake2011BluRayREMUX1080pAVCDTS-HDMA5.1DD5.1-CHD.ts",Microsoft.VisualBasic.FileIO.UIOption.AllDialogs,Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);
解决方案九:
这代码很懒,你觉得“严谨”也许是不知道到评判的标准。唯一可取的,就是他知道以一个sectSize大小的buffer来中介,而不是滥用无限的空间。除此以外这个代码有太多的bad味道。
解决方案十:
随便说一个我从来没有见过这么烂的地方,比如说假设buffer大小事32k,那么每一次Stream.Read都会返回32k,或者当处于最后一块区域时就可能小于32k的值返回FileSize变量中。不论这个变量中是多大的值,只要是>0就可以把buffer中前FileSize个字节写入目标文件,然后当读取到(例如最后一次必定FileSize==0)就跳出循环就行了。而这个程序计算什么copied,甚至跳出循环之后还要再计算、再读写,别人干净的4、5行程序被他写成十几行混乱的程序了。类似的地方还有不下3处。这应该是一个刚从学校毕业的纨绔子弟的作品。可能他的老师以为他花哨,但是其实花哨的东西就很危险。
解决方案十一:
这玩意没可读性,不科学。