供应商给的HT660开发包中,提供了.net的相关文件传输类库。由于我的管理系统是用Delphi7开发的。需要的是原生的文件传输控制API。
Windows提供了RAPI库,实际可以控制HT660的文件传输。
举例如下:
function THT660Comm.CopyFileFromDevice(strHTFilename,
strPCFilename: string; bExistFile: Boolean): Boolean;
var
fFile, fPCFile: THandle;
bstr: PWideChar;
cTemp: array[1..BUFFER_SIZE] of Char;
nNumberOfBytesToRead: DWORD;
//lpNumberOfBytesRead: PDWORD;
begin
if not FConnected then
begin
Result := False;
Exit;
end;
GetMem(bstr, Length(strHTFilename) * 2 + 2);
SetThreadLocale(LOCALE_SYSTEM_DEFAULT);
StringToWideChar(strHTFilename, bstr, Length(strHTFilename) * 2 + 2);
fFile := CeCreateFile(bstr, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
FreeMem(bstr);
if fFile = INVALID_HANDLE_VALUE then
begin
Result := False;
Exit;
end;
nNumberOfBytesToRead := BUFFER_SIZE;
if not bExistFile then
begin
if FileExists(strPCFilename) then
begin
Result := False;
Exit;
end;
end;
fPCFile := CreateFile(PChar(strPCFilename), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if fPCFile = INVALID_HANDLE_VALUE then
begin
Result := False;
Exit;
end;
while CeReadFile(fFile, @cTemp[1], nNumberOfBytesToRead, @nNumberOfBytesToRead, nil) and (nNumberOfBytesToRead > 0) do
begin
WriteFile(fPCFile, cTemp, nNumberOfBytesToRead, nNumberOfBytesToRead, nil);
ZeroMemory(@cTemp[1], BUFFER_SIZE);
end;
CeCloseHandle(fFile);
CloseHandle(fPCFile);
Result := True;
end;