关于用VB拷贝文件?
有什么方法可以提高windows拷贝文件的速度,有现在的方案:
1,用如下API
Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
'Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByVal lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long
2,用
Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
3,用Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
我想请问哪种方法最快的,并且我想加功能就是断点续传功能.
问题点数:0、回复次数:7Top
1 楼songyaowu(不以分多而蹭之;不因分少而不答; www.vb99.com)回复于 2004-12-03 08:28:18 得分 0
断点续传功能?恐怕只有第一种了吧。Top
2 楼jhtzz(执著男孩)回复于 2004-12-03 09:29:56 得分 0
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
那我想知道,这个API里面的
其中nNumberOfBytesToRead,就竟能放多大,是不是越大拷贝越快?但我测试,越大越快,但反而最几十字节的出问题了,比如说复制一个快捷方式,可是复制过后的快捷方式变了,不对,读出的大小也没有变化,反正就是用不起,那么我还想问,在程序复制的过程中能否跟据文件的大小或系统的存受能力来实时改变nNumberOfBytesToRead的大小?Top
3 楼cosio()回复于 2004-12-03 10:22:29 得分 0
,可是复制过后的快捷方式变了
________________________________________________________
你不要用快捷方式来复制,因为快捷方式有路径的限制,你复制一个.exe的文件!
应该就可以了!Top
4 楼baoaya(点头)(大风起兮云飞扬)回复于 2004-12-03 10:27:34 得分 0
使用这个来拷贝
Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As LongTop
5 楼jhtzz(执著男孩)回复于 2004-12-03 10:55:37 得分 0
TO baoaya(点头):
你说的这个API复制太慢了,而且复制到中途的时候出错的话我不知道拷到哪里了?
TO cosio():
你没有呼明白我的意思,呵呵,快捷方式也是一个文件呀,问题是我要我要连快捷方式一起拷贝,比如说哈,我有一个目录,下面又有文件,又有快捷方式 ,哎!!其实说多了你都听糊了,其实一句话,就是小到几个字节的时候文件复制有问题,如果我将nNumberOfBytesToRead设成512或更小的,那大小文件都怪了,可是速度又提不来,我以前设的是1024*40,所以每秒的拷贝速度可以达到8--9M吧.Top
6 楼jhtzz(执著男孩)回复于 2004-12-03 10:56:36 得分 0
TO baoaya(点头):
你说的这个API复制太慢了,而且复制到中途的时候出错的话我不知道拷到哪里了?
TO cosio():
你没有呼明白我的意思,呵呵,快捷方式也是一个文件呀,问题是我要我要连快捷方式一起拷贝,比如说哈,我有一个目录,下面又有文件,又有快捷方式 ,哎!!其实说多了你都听糊了,其实一句话,就是小到几个字节的时候文件复制没有问题,如果我将nNumberOfBytesToRead设成512或更小的,那大小文件都对了,可是速度又提不来Top
7 楼jhtzz(执著男孩)回复于 2004-12-03 13:24:44 得分 0
另外:
Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
和
Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long
我想请问这两个API哪个快,那个的功能强大,因为我遇见一种情况,如下在拷贝的目标文件存在,并且带有只读属性,那么Openfile将打不开,也就是不能写入输入,如改成CreateFile呢?能否强制复盖呀Top




