delphi FTP源码
delphi上传本地目录到FTP服务器
//we only want to have directories in the list (without ’.’ and ’..’)
//nun filtern wir das nach den ordnern (ohne ’.’ und ’..’)
end;
end;
var
dir: string;
details, nodetails: TStringList;
k: Integer;
begin
//set some basic settings on your ftp client (TIdFTPClient)
//falls unser ordner auf dem server noch nicht existiert, legen wir ihn an
if nodetails.IndexOf() = -1 then
begin
(nodetails.Strings[k] = ’.’) or
(nodetails.Strings[k] = ’..’) then
begin
details.Delete(k);
//hier kommen die grundangaben für unseren ftp client hin (TIdFTPClient)
with FTPClient do
begin
Host := ’your_’; // Adjust your data here / Hier gwünschte Daten eintragen
if dir <> ’’ then
begin
if dir[1] = ’/’ then Delete(dir, 1, 1);
idftp用法 -回复
idftp用法-回复"IDFTP用法" - 一步一步回答IDFTP(Internet Direct FTP)是Delphi语言开发的一个功能强大的FTP 组件,用于在Delphi应用程序中进行FTP文件的传输和管理。
本文将一步一步介绍IDFTP的用法,帮助读者了解如何使用该组件来实现FTP功能。
第一步:安装和使用IDFTP组件在使用IDFTP之前,首先需要在Delphi开发环境中安装该组件。
通常可以从第三方网站下载安装文件,然后按照安装向导进行安装。
安装完成后,在Delphi的组件面板中会出现IDFTP组件,可以将其拖放到需要使用FTP 功能的窗体上。
第二步:建立FTP连接在使用IDFTP组件之前,需要先建立与FTP服务器的连接。
可以使用以下代码来建立连接:delphiIDFTP.Host := 'ftp.example'; FTP服务器地址ername := 'username'; FTP登录用户名IDFTP.Password := 'password'; FTP登录密码IDFTP.Connect;上述代码中,将`Host`、`Username`和`Password`属性设置为相应的FTP 服务器地址、登录用户名和密码,然后调用`Connect`方法建立连接。
第三步:上传文件连接成功后,可以使用IDFTP组件的`Put`方法将文件上传到FTP服务器。
可以使用以下代码实现上传功能:delphiIDFTP.Put('localfile.txt', '/remotefolder/remoteFile.txt');上述代码中,将要上传的本地文件路径作为`Put`方法的第一个参数,将要保存在服务器上的文件路径作为第二个参数。
第四步:下载文件与上传类似,可以使用`Get`方法从FTP服务器下载文件。
以下是一个示例代码:delphiIDFTP.Get('/remotefolder/remoteFile.txt', 'localfile.txt');上述代码中,将要下载的文件路径作为`Get`方法的第一个参数,将要保存在本地的文件路径作为第二个参数。
Delphi客户端通过FTP服务器上传或下载文件或图片方法
Delphi客户端通过FTP服务器上传或下载文件或图片方法Delphi客户端通过FTP服务器上传或下载文件或图片方法首先在服务器端建立FTP服务器,网上有这种类型的软件,安装好后,在客户端建立服务器连接,然后再上传或下载文件或图片。
一、服务器连接procedure TForm1.ConnectButtonClick(Sender: TObject);beginif not IdFTP1.Connected then //如果与服务器断开连接begintry/doc/c312652032.html,ername:=UserI DEdit.Text;IdFTP1.Password:=PasswordEdit.Text;IdFTP1.Host:=FtpServerEdit.Text;IdFTP1.Connect; //Connect;Except //异常处理Application.MessageBox('服务器连接失败!','智博软件');end;ConnectButton.Enabled:=true;if IdFTP1.Connected thenbeginConnectButton.Caption:='断开';DebugListBox.Items.Add('主机名为:'+IdFTP1.Host);DebugListBox.Items.Add('连接成功');ConnectButton.Default:=false;end;endelsetryIdFTP1.Quit; //关闭客户端与服务器端的连接finallyConnectButton.Caption:='连接';DebugListBox.Items.Add('连接失败'); ConnectButton.Enabled:=true;ConnectButton.Default:=true;end;end;二、文件或图片上传Procedure TFrmMain.UploadFileCleck(Sender:TObject); varFileName : string;Item : TListItem;SendFileItem : TListItem;beginif not FTPClient.Connected thenexit;if ListViewLocalFile.Selected =nil thenexit;Item :=ListViewLocalFile.Selected; ListViewSendFile.Clear;//处理所有选中文件while Item <>nil dobeginSendFileItem := ListViewSendFile.Items.Add; SendFileItem.Caption := Item.Caption; //文件名SendFileItem.SubItems.Add(Item.SubItems[1]); //文件大小SendFileItem.SubItems.Add(LocaLPath); //本地路径SendFileItem.SubItems.Add('==>'); //图示SendFileItem.SubItems.Add(RemotePath); //远程路径SendFileItem.SubItems.Add(''); //状态//下一个选中的项目Item:=ListViewLocalFile.GetNextItem(Item,sdAll,[isSelected]);end;ListViewSendFile.Refresh; //刷新传送文件列表//传送文件ListViewLocalFile.Enabled :=false;DriveComboBox1.Enabled:=false;ListViewRemoteFile.Enabled:=False;IsTransFerring:=True;try//处理所有要传送的文件while ListViewSendFile.Items.Count>0 dobeginFileName:=ListViewSendFile.Item[0].Caption; //文件名ListViewSendFile.Item[0].SubItems[4]:='正在上传...';FTPClient.Put(LocalPath+'\'+FileName); //上传DisplayRemoteFileList();ListViewSendFile.items[0].Delect; //传送完毕,删除待传送文件列表ListViewSendFile.Refresh;end;//设置相关控件是否可用ListViewLocalFile.Enabled:=True;DriveComboBox1.Enabled:=True;ListVieewRemoteFile.Enabled:=True;IsTransferring:=False;exceptListViewSendFile.Items[0].SubItems[4]:='上传错误!';MessageDlg('上传文件发生错误!',mtError,[mbyes],0);//设置相关控件是否可用ListViewLocalFile.Enabled:=True;DriveCombBox1.Enabled:=True;ListViewRemoteFile.Enabled:=True;IsTransferring:=False; //没有传送状态end;end;三、文件或图片下载procedure TFrmMain.DownloadFileClick(Sender:TObject);varFileName :String;Item ,SendFileItem : TListItem;beginif not FTPClient.Connected Then //没有连接到服务器,退出exit;if ListViewRemoteFile.Selected; //得到选中的文件ListViewSendFile.Clear; //清空要传送的文件列表//处理所有选中的文件While Item <> nil dobeginSendFileItem :=ListViewSendFile.Items.Add; //增加到列表//列表项赋值SendFileItem.Caption := Item.Caption; //文件名SendFileItem.SubItems.Add(Item.SubItems[1]); //文件大小SendFileItem.SubItems.Add(LocaLPath); //本地路径SendFileItem.SubItems.Add('<=='); //图示SendFileItem.SubItems.Add(RemotePath); //远程路径SendFileItem.SubItems.Add('');//下一个选中的项目Item:=ListViewRemoteFile.GetNextItem(Item,sdAll,[isSelected]);end;ListViewSendFile.Refresh; //刷新传送文件列表//传送文件ListViewRemoteFile.Enabled:=false; //禁止操作相关控件IsTransferring:=True; //设置正在传送try//处理所有要传送的文件while ListViewSendFile.Items.Count >0 dobeginFileName := ListViewSendFile.Items[0].Caption; //文件名ListViewSendFile.Items[0].SubItems[4]:='正在下载...';ListViewSendFile.Refresh; //刷新传送文件列表if FileExists(FileName) then //判断文件是否存在beginif MessageDlg('文件己存在,继续下载吗?',mtConfirmation,[mbYes,mbNo],0)=mrYes thenFTPClient.Get(FileName,LocalPath+'\'+FileName,false,true) //续传elseFTPClient.Get(FileName,LocalPath+'\'+FileName,true,False); //覆盖endelseFTPClient.Get(FileName,LocalPath+'\'+FileName,false); //下载ListViewSendFile.items[0].Delect; //传送完毕,删除待传送文件列表ListViewSendFile.Refresh; //刷新待传送列表DisplayLocalFileList(); //刷新本地文件列表end;ListViewRemoteFile.Enabled:=true; IsTransferring:=False; //没有传送状态exceptListViewSendFile.Items[0].SubItems[4]:='下载错误'; ListViewSendFile.Refresh; //刷新待传送文件列表MessageDlg('下载文件发生错误!',mtError,[nbYes],0); ListViewRemoteFile.Enabled:=True; IsTransferring:=False; //没有传送状态end;end;以上代码在Delphi7中调试通过。
DELPHI编程经典源码总结
个人收集资料系列Delphi精典技艺问:如何让del+CTRL+ALT看不见程序运行?答:为了让程序用ALT+DEL+CTRL看不见,在implementation后添加声明:function RegisterServiceProcess(dwProcessID,dwType:Integer):Integer;stdcall;external'KERNEL32.DLL';再在上面的窗口Create事件加上一句:RegisterServiceProcess(GetCurrentProcessID,1);//隐藏也可以使用下面的函数:function My_SelfHide:Boolean;typeTRegisterServiceProcess=function(dwProcessID,dwType:DWord):DWORD;stdcall;varhNdl:THandle;RegisterServiceProcess:TRegisterServiceProcess;beginResult:=False;if Win32Platform<>VER_PLATFORM_WIN32_NT then//不是NTbeginhNdl:=LoadLibrary('KERNEL32.DLL');RegisterServiceProcess:=GetProcAddress(hNdl,'RegisterServiceProcess');RegisterServiceProcess(GetCurrentProcessID,1);FreeLibrary(hNdl);Result:=True;endelseExit;end;问:自我拷贝法怎么样使用?答:这种方法的原理是程序运行时先查看自己是不是在特定目录下,如果是就继续运行,如果不是就把自己拷贝到特定目录下,然后运行新程序,再退出旧程序.打开Delphi,新建一个工程,在窗口的Create事件中写代码:procedure TForm1.FormCreate(Sender:TObject);var myname:string;beginmyname:=ExtractFilename(Application.Exename);//获得文件名if application.Exename<>GetWindir+myname then//如果文件不是在Windows\System\那么..begincopyfile(pchar(application.Exename),pchar(GetWindir+myname),False);{将自己拷贝到Windows\System\下}Winexec(pchar(GetWindir+myname),sw_hide);//运行Windows\System\下的新文件application.Terminate;//退出end;end;其中GetWinDir是自定义函数,起功能是找出Windows\System\的路径.function GetWinDir:String;varBuf:array[0..MAX_PATH]of char;beginGetSystemDirectory(Buf,MAX_PATH);Result:=Buf;if Result[Length(Result)]<>'\'then Result:=Result+'\';end;问:如何避免同时运行多个相同程序?答:为了避免同时运行多个程序的副本(节约系统资源也),程序一般会弄成每次只能运行一个.这又有几种方法.一种方法是程序运行时先查找有没有相同的运行了,如果有,就立刻退出程序.修改dpr项目文件,修改begin和end之间的代码如下:beginApplication.Initialize;if FindWindow('TForm1','Form1')=0then begin//当没有找到Form1时执行下面代码Application.ShowMainForm:=False;//不显示主窗口Application.CreateForm(TForm1,Form1);Application.Run;end;end.另一种方法是启动时会先通过窗口名来确定是否已经在运行,如果是则关闭原先的再启动。
FTP C语言源代码
memset( &fileinfo, 0x00, sizeof(fileinfo) ); nRet = recv( s , ( char *)&fileinfo, sizeof(fileinfo), 0 ); if( nRet == SOCKET_ERROR ) {
return SOCK_RECVE_ERR; }
case SOCK_LISTEN_ERR: cout<<"SOCK_LISTEN_ERR"<<endl; break; 失败
// 监 听
case SOCK_ACCEPT_ERR: cout<<"SOCK_ACCEPT_ERR"<<endl; break; 连接失败
// 等 待
case SOCK_SEND_ERR: 失败
SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );//创建套接字
if( s == INVALID_SOCKET )
{ return SOCK_CRSOCK_ERR;
//错误处理
}
unsigned long uladdr; uladdr = inet_addr("127.0.0.1");
#define #define #define #define #define #define #define #define #define #define #define
TRAN_SUCCESS 1 //传输成功
SOCK_WSA_ERR (-1) //启动 winsock 失败
SOCK_CRSOCK_ERR (-2) //创建套接字失败
//保证字节顺序 //保证字节顺序
delphi11.3中linuxpaserver源代码 -回复
delphi11.3中linuxpaserver源代码-回复Delphi 11.3 LinuxPaserver源代码解析Delphi 11.3是一款非常流行的集成开发环境(IDE),主要用于在Windows操作系统上使用Object Pascal编程语言开发应用程序。
然而,对于那些希望将Delphi代码扩展到其他平台上的开发人员来说,这样的选择可能有限。
好在,Delphi 11.3引入了LinuxPaserver源代码,使开发人员能够在Linux操作系统上开发和调试代码。
LinuxPaserver作为一个独立的组件,它充当了Windows操作系统和Linux操作系统之间的桥梁,使得Delphi开发者能够使用Delphi IDE在Windows上构建应用程序,并在Linux上运行和调试。
这为Delphi开发者提供了在不同操作系统上的更多选择,使其能够将代码移植到多个平台。
现在,让我们一步一步地解析Delphi 11.3中LinuxPaserver的源代码。
第一步:了解PaserverPaserver是Delphi 11.3中运行在Linux操作系统上的后台服务。
它允许Delphi IDE与Linux主机之间进行通信,并且可以实时调试和追踪代码。
Paserver支持通过TCP/IP协议进行通信,并提供了一组命令来执行各种操作,如启动调试会话、加载和保存文件等。
第二步:建立连接在Delphi IDE中,要在Linux操作系统上进行开发,首先需要与Linux 主机建立连接。
这可以通过打开“Tools”菜单,选择“Deploy Linux Paserver”选项来实现。
在弹出的对话框中,输入Linux主机的IP地址和登录凭据,然后点击“Connect”按钮。
第三步:配置和部署应用程序连接成功后,Delphi IDE会将应用程序的文件和相关资源部署到Linux主机上。
在部署过程中,Delphi IDE将自动调用Paserver来执行相关操作,如创建目录、复制文件等。
delphi11.3中linuxpaserver源代码
delphi11.3中linuxpaserver源代码Delphi 11.3中LinuxPaserver源代码Delphi 11.3是一款被广泛使用的集成开发环境(IDE),专门用于开发跨平台应用程序。
其中的LinuxPaserver源代码是Delphi在Linux平台上实现的一项重要功能。
本文将介绍Delphi 11.3中LinuxPaserver源代码的相关内容。
一、LinuxPaserver简介LinuxPaserver是Delphi的一个组件,它允许在Linux平台上进行开发、调试、部署和测试Delphi应用程序。
通过LinuxPaserver,开发人员可以使用Delphi IDE来创建跨平台应用,并且在Linux环境中进行调试和运行。
LinuxPaserver提供了一种简单有效的方式,让开发人员能够在Delphi IDE中使用Linux环境下的调试和运行工具。
通过LinuxPaserver,开发人员可以实现将Delphi应用程序移植到Linux平台,扩大了应用程序的覆盖范围,提高了开发效率。
二、LinuxPaserver源代码结构LinuxPaserver源代码是开放的,允许开发人员自行修改和定制。
其主要包含以下几个部分:1. 通信模块:用于实现Delphi IDE与LinuxPaserver之间的通信,确保二者之间的实时数据交互。
通信模块采用Socket通信方式,使用TCP/IP协议进行数据传输。
2. 调试模块:用于在Linux环境下进行应用程序的调试。
调试模块提供了一系列的调试工具,如断点调试、调试输出、变量监视等,以帮助开发人员定位和修复程序中的错误。
3. 运行时环境:LinuxPaserver源代码中还包含了一个运行时环境,用于加载和执行Delphi应用程序。
运行时环境提供了一些必要的运行时库和类,使得应用程序能够在Linux环境中正确运行。
三、LinuxPaserver源代码的重要功能1. 跨平台开发:LinuxPaserver使得开发人员可以在Delphi IDE中进行跨平台开发。
求用Delphi实现的FTP服务器端程序
求用Delphi实现的FTP服务器端程序{ $HDR$}{************************************************************** ********}{ Unit archived using Team Coherence } { Team Coherence is Copyright 2002 by Quality Software Co mponents }{ }{ For further information / comments, visit our WEB site at }{ }{************************************************************** ********}{}{ $Log: 23310: FTPServer_console.dpr{{ Rev 1.1 25/10/2004 22:48:54 ANeillans Version: 9.0.1 7{ Verified}{{ Rev 1.0 12/09/2003 22:47:52 ANeillans{ Initial Checkin{ Verified against Indy 9 and D7}{Demo Name: FTP Server DemoCreated By: Bas GooijenOn: UnknownNotes:FTP Server DemoSample of the usage of the TIdFtpServer component. Also shows how to use Indy in console appsUsername: myuserPassword: mypassVersion History:NoneTested:Indy 9:D5: UntestedD6: UntestedD7: 25th Oct 2004 by Andy NeillansTested with Microsoft FTP Client}program FTPServer_console;{$APPTYPE console}usesClasses,windows,sysutils,IdFTPList,IdFTPServer,idtcpserver,IdSocketHandle,idglobal,IdHashCRC;typeTFTPServer = classprivate{ Private declarations }IdFTPServer: tIdFTPServer;procedure IdFTPServer1UserLogin( ASender: TIdFTPServerT hread; const AUsername, APassword: string; var AAuthenticated: Boolean ) ;procedure IdFTPServer1ListDirectory( ASender: TIdFTPServe rThread; const APath: string; ADirectoryListing: TIdFTPListItems ) ;procedure IdFTPServer1RenameFile( ASender: TIdFTPServer Thread; const ARenameFromFile, ARenameT oFile: string ) ;procedure IdFTPServer1RetrieveFile( ASender: TIdFTPServer Thread; const AFilename: string; var VStream: TStream ) ;procedure IdFTPServer1StoreFile( ASender: TIdFTPServerThr ead; const AFilename: string; AAppend: Boolean; var VStream: T Stream ) ;procedure IdFTPServer1RemoveDirectory( ASender: TIdFTP ServerThread; var VDirectory: string ) ;procedure IdFTPServer1MakeDirectory( ASender: TIdFTPSer verThread; var VDirectory: string ) ;procedure IdFTPServer1GetFileSize( ASender: TIdFTPServer Thread; const AFilename: string; var VFileSize: Int64 ) ;procedure IdFTPServer1DeleteFile( ASender: TIdFTPServerThread; const APathname: string ) ;procedure IdFTPServer1ChangeDirectory( ASender: TIdFTPS erverThread; var VDirectory: string ) ;procedure IdFTPServer1CommandXCRC( ASender: TIdCom mand ) ;procedure IdFTPServer1DisConnect( AThread: TIdPeerThrea d ) ;protectedfunction TransLatePath( const APathname, homeDir: string ) : string;publicconstructor Create; reintroduce;destructor Destroy; override;end;constructor TFTPServer.Create;beginIdFTPServer := tIdFTPServer.create( nil ) ;IdFTPServer.DefaultPort := 21;IdFTPServer.AllowAnonymousLogin := False;IdFTPServer.EmulateSystem := ftpsUNIX;IdFTPServer.HelpReply.text := 'Help is not implemented';IdFTPServer.OnChangeDirectory := IdFTPServer1ChangeDir ectory;IdFTPServer.OnChangeDirectory := IdFTPServer1ChangeDir ectory;IdFTPServer.OnGetFileSize := IdFTPServer1GetFileSize;IdFTPServer.OnListDirectory := IdFTPServer1ListDirectory;IdFTPServer.OnUserLogin := IdFTPServer1UserLogin;IdFTPServer.OnRenameFile := IdFTPServer1RenameFile;IdFTPServer.OnDeleteFile := IdFTPServer1DeleteFile;IdFTPServer.OnRetrieveFile := IdFTPServer1RetrieveFile;IdFTPServer.OnStoreFile := IdFTPServer1StoreFile;IdFTPServer.OnMakeDirectory := IdFTPServer1MakeDirector y;IdFTPServer.OnRemoveDirectory := IdFTPServer1RemoveDir ectory;IdFTPServer.Greeting.NumericCode := 220;IdFTPServer.OnDisconnect := IdFTPServer1DisConnect;with mandHandlers.add dobeginCommand := 'XCRC';OnCommand := IdFTPServer1CommandXCRC;end;IdFTPServer.Active := true;end;function CalculateCRC( const path: string ) : string;varf: tfilestream;value: dword;IdHashCRC32: TIdHashCRC32;beginIdHashCRC32 := nil;f := nil;tryIdHashCRC32 := TIdHashCRC32.create;f := TFileStream.create( path, fmOpenRead or fmShareDeny Write ) ;value := IdHashCRC32.HashValue( f ) ;result := inttohex( value, 8 ) ;finallyf.free;IdHashCRC32.free;end;end;procedure TFTPServer.IdFTPServer1CommandXCRC( ASend er: TIdCommand ) ;// note, this is made up, and not defined in any rfc.vars: string;beginwith TIdFTPServerThread( ASender.Thread ) dobeginif Authenticated thenbegintrys := ProcessPath( CurrentDir, ASender.UnparsedParams ) ;s := TransLatePath( s, TIdFTPServerThread( ASender.Thread ) .HomeDir ) ;ASender.Reply.SetReply( 213, CalculateCRC( s ) ) ;exceptASender.Reply.SetReply( 500, 'file error' ) ;end;end;end;end;destructor TFTPServer.Destroy;beginIdFTPServer.free;inherited destroy;end;function StartsWith( const str, substr: string ) : boolean; beginresult := copy( str, 1, length( substr ) ) = substr;end;function BackSlashToSlash( const str: string ) : string; vara: dword;beginresult := str;for a := 1 to length( result ) doif result[a] = '\' thenresult[a] := '/';end;function SlashToBackSlash( const str: string ) : string; vara: dword;beginresult := str;for a := 1 to length( result ) doif result[a] = '/' thenresult[a] := '\';end;function TFTPServer.TransLatePath( const APathname, home Dir: string ) : string;vartmppath: string;beginresult := SlashT oBackSlash( homeDir ) ;tmppath := SlashT oBackSlash( APathname ) ;if homedir = '/' thenbeginresult := tmppath;exit;end;if length( APathname ) = 0 thenexit;if result[length( result ) ] = '\' thenresult := copy( result, 1, length( result ) - 1 ) ;if tmppath[1] <> '\' thenresult := result + '\';result := result + tmppath;end;function GetSizeOfFile( const APathname: string ) : int64;beginresult := FileSizeByName( APathname ) ;end;function GetNewDirectory( old, action: string ) : string;vara: integer;beginif action = '../' thenbeginif old = '/' thenbeginresult := old;exit;end;a := length( old ) - 1;while ( old[a] <> '\' ) and ( old[a] <> '/' ) dodec( a ) ;result := copy( old, 1, a ) ;exit;end;if ( action[1] = '/' ) or ( action[1] = '\' ) thenresult := actionelseresult := old + action;end;procedure TFTPServer.IdFTPServer1UserLogin( ASender: TId FTPServerThread;const AUsername, APassword: string; var AAuthenticated: B oolean ) ;beginAAuthenticated := ( AUsername = 'myuser' ) and ( APasswor d = 'mypass' ) ;if not AAuthenticated thenexit;ASender.HomeDir := '/';asender.currentdir := '/';end;procedure TFTPServer.IdFTPServer1ListDirectory( ASender: TIdFTPServerThread; const APath: string; ADirectoryListing: TIdF TPListItems ) ;procedure AddlistItem( aDirectoryListing: TIdFTPListItems; F ilename: string; ItemType: TIdDirItemType; size: int64; date: tdat etime ) ;varlistitem: TIdFTPListItem;beginlistitem := aDirectoryListing.Add;listitem.ItemType := ItemType;listitem.FileName := Filename;listitem.OwnerName := 'anonymous';listitem.GroupName := 'all';listitem.OwnerPermissions := '---';listitem.GroupPermissions := '---';erPermissions := '---';listitem.Size := size;listitem.ModifiedDate := date;end;varf: tsearchrec;a: integer;beginADirectoryListing.DirectoryName := apath;a := FindFirst( TransLatePath( apath, ASender.HomeDir ) + '* .*', faAnyFile, f ) ;while ( a = 0 ) dobeginif ( f.Attr and faDirectory > 0 ) thenAddlistItem( ADirectoryListing, , ditDirectory, f.size, Fi leDateToDateTime( f.Time ) )elseAddlistItem( ADirectoryListing, , ditFile, f.size, FileDat eToDateTime( f.Time ) ) ;a := FindNext( f ) ;end;FindClose( f ) ;end;procedure TFTPServer.IdFTPServer1RenameFile( ASender: TI dFTPServerThread;const ARenameFromFile, ARenameToFile: string ) ;beginif not MoveFile( pchar( TransLatePath( ARenameFromFile, A Sender.HomeDir ) ) , pchar( TransLatePath( ARenameT oFile, ASe nder.HomeDir ) ) ) thenRaiseLastWin32Error;end;procedure TFTPServer.IdFTPServer1RetrieveFile( ASender: TI dFTPServerThread;const AFilename: string; var VStream: TStream ) ;beginVStream := TFileStream.create( translatepath( AFilename, AS ender.HomeDir ) , fmopenread or fmShareDenyWrite ) ;end;procedure TFTPServer.IdFTPServer1StoreFile( ASender: TIdF TPServerThread;const AFilename: string; AAppend: Boolean; var VStream: TS tream ) ;beginif FileExists( translatepath( AFilename, ASender.HomeDir ) ) and AAppend thenbeginVStream := TFileStream.create( translatepath( AFilename, AS ender.HomeDir ) , fmOpenWrite or fmShareExclusive ) ;VStream.Seek( 0, soFromEnd ) ;endelseVStream := TFileStream.create( translatepath( AFilename, AS ender.HomeDir ) , fmCreate or fmShareExclusive ) ;end;procedure TFTPServer.IdFTPServer1RemoveDirectory( ASen der: TIdFTPServerThread;var VDirectory: string ) ;beginRmDir( TransLatePath( VDirectory, ASender.HomeDir ) ) ;end;procedure TFTPServer.IdFTPServer1MakeDirectory( ASender: TIdFTPServerThread;var VDirectory: string ) ;beginMkDir( TransLatePath( VDirectory, ASender.HomeDir ) ) ;end;procedure TFTPServer.IdFTPServer1GetFileSize( ASender: TI dFTPServerThread;const AFilename: string; var VFileSize: Int64 ) ;beginVFileSize := GetSizeOfFile( TransLatePath( AFilename, ASend er.HomeDir ) ) ;end;procedure TFTPServer.IdFTPServer1DeleteFile( ASender: TId FTPServerThread;const APathname: string ) ;beginDeleteFile( pchar( TransLatePath( ASender.CurrentDir + '/' + APathname, ASender.HomeDir ) ) ) ;end;procedure TFTPServer.IdFTPServer1ChangeDirectory( ASen der: TIdFTPServerThread;var VDirectory: string ) ;beginVDirectory := GetNewDirectory( ASender.CurrentDir, VDirect ory ) ;end;procedure TFTPServer.IdFTPServer1DisConnect( AThread: TI dPeerThread ) ;begin// nothing much hereend;beginwith TFTPServer.Create dotrywriteln( 'Running, press [enter] to terminate' ) ;readlnfinallyfree;end;end.。
delphi idftp用法
delphi idftp用法Delphi中的IDFTP组件是用于实现FTP(文件传输协议)客户端功能的组件。
以下是使用IDFTP的基本步骤:1. 添加IDFTP组件:将IDFTP组件拖动到Delphi的窗体上或创建一个全局的IDFTP对象。
2. 设置FTP服务器信息:通过IDFTP的Host、Port和UserName属性设置FTP服务器的主机地址、端口号和用户名。
还可以设置Password属性设置登录密码。
3. 连接到FTP服务器:调用IDFTP的Connect方法来建立与FTP服务器的连接。
可以在OnConnect事件中处理连接成功之后的逻辑。
4. 执行FTP操作:通过调用IDFTP的各种方法来执行FTP操作,如上传文件、下载文件、创建目录、删除文件等。
- 使用Put方法上传文件:可以通过代码像以下示例这样上传文件:delphiIDFTP1.Put('local_file_path', 'remote_file_path');- 使用Get方法下载文件:可以通过代码像以下示例这样下载文件:delphiIDFTP1.Get('remote_file_path', 'local_file_path');- 使用MakeDir方法创建目录:可以通过代码像以下示例这样创建目录:delphiIDFTP1.MakeDir('directory_name');- 使用Delete方法删除文件:可以通过代码像以下示例这样删除文件:delphiIDFTP1.Delete('remote_file_path');5. 断开连接:使用IDFTP的Disconnect方法来断开与FTP服务器的连接。
这只是IDFTP的基本用法,还可以通过查阅IDFTP的文档来了解更多操作和事件处理的细节。
计算机毕业设计37DELPHI基于FTP协议的文件访问系统的设计与实现
分类号:TP311.1 U D C:D10621-408-(2007)5935-0密级:公开编号:2003214005成都信息工程学院学位论文基于FTP协议的文件访问控制系统的设计与实现论文作者姓名:张旭申请学位专业:计算机科学与技术申请学位类别:工学学士指导教师姓名(职称):张路桥论文提交日期:2007年06月10 日基于FTP协议的文件访问控制系统的设计与实现摘要现在有了网络,网络用户不但可以浏览各种各样的信息资源,还能够将自己感兴趣和需要的资源下载到本地机上,但这样也加大了对资源的需求量。
由于网络的带宽及各种服务的限制,单纯从页面上下载显得又慢又不可靠,而且也无法满足众多用户的需求,所以就有许多FTP工具应运而生。
本软件是用DELPHI7.0作为开发工具完成的,系统开发的总体任务是连接FTP服务器,上传/下载文件、对FTP服务器站点的管理、服务器端提供本地FTP 服务、允许远程登录下载服务器上的文件。
本论文共分为五大模块,分别是:介绍选题背景及意义和系统的发展现状;介绍数据库技术和Delphi技术;对当前企业进行需求分析并提出解决方案;根据需求方案对系统进行设计;对工作计划统计分析系统进行测试并得到测试结果。
关键词:FTP;文件访问;后台数据库The File Access Control System Based on FTPAbstractThrough the Internet, people are not only able to browse all sorts of information, but also able to download interesting resources. However, due to different constrains it is inefficient and unreliable to download by web page. Therefore, there are requirements for better download tools, such as FTP tools.This software is developed by using DELPHI7.0, the major duties for the system is to connect to the FTP server, to administrate the FTP service sites, to allow file downloading from remote control.There are 5 parts in this paper: introduction of the background and significance of the topic, and generalization of the development of the system, introduction of the technology of database and Delphi, analysis of the current requirements of enterprises, design and implementation of the system, and test of the system.Key words:FTP; File Access; Background Database.目录1 选题意义 (2)1.1 课题背景 (2)1.2 国内外研究现状 (2)1.3 本课题研究的目的 (2)2 相关理论基础 (3)2.1 网络概念 (3)2.2 D ELPHI技术 (3)2.3 D ELPHI的控件安装方法 (4)2.4 M ICROSOFT SQL S ERVER数据库技术 (5)3 需求分析 (5)3.1 需求概述 (5)3.2 登陆模块 (6)3.3 用户注册模块 (6)3.4 客户端模块 (6)3.5 服务器模块 (6)4 设计与实现 (6)4.1 系统概要设计 (6)4.1.1 概要设计 (6)4.1.2 条件与限制 (7)4.2 系统的详细设计 (7)4.2.1 系统总体流程 (7)4.2.2 各模块处理流程 (8)4.2.3 数据库设计 (11)4.3 典型模块实现 (11)5 测试 (13)5.1 测试环境 (13)5.2 测试的目的 (14)5.3 测试方案 (14)结论 (16)参考文献 (17)致谢 (18)声明 (19)1选题意义1.1课题背景现代科技给我们带来了翻天覆地的变化,互联网就是这诸多变化之一,而且它无时不刻地包围着你。
FtpClient源代码(C#)
private static int BUFFER_SIZE = 512;
private static Encoding ASCII = Encoding.ASCII;
private bool verboseDebugging = false;
// defaults
private string message = null;
private string result = null;
private int port = 21;
private int bytes = 0;
private int resultCode = 0;
private bool loggedin = false;
}
set
{
this.server = value;
}
}
/// <summary>
/// Gets and Sets the port number.
/// </summary>
/// <returns></returns>
public int RemotePort
using System;
using ;
using System.IO;
using System.Text;
using .Sockets;
using System.Diagnostics;
using System.Runtime.Remoting;
}
}
/// <summary>
/// If the value of mode is true, set binary mode for downloads, else, Ascii mode.
delphi的TFileStream类
varFileStream: TFileStream;beginFilestream:=TFileStream.Create(AFileName,fmShareExclusive);Filestream.Position:=0;FileStream.Read(ABuffer,sizeof(ABuffer));FreeAndNil(FileStream);end;procedure PutMessageToDir(AFileName:string; Astr :string);varFileStream: TFileStream;tempBuffer:TBuffer;beginStrPcopy(tempBuffer,Astr);Filestream:=TFileStream.Create(AFileName,fmShareExclusive or fmCreate);FileStream.Position:=0;FileStream.Write(tempBuffer,length(AStr));FreeAndNil(FileStream);end;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 一个实例/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////procedure TForm1.Button1Click(Sender: TObject);vargetStream,setStream: TFileStream; {声明一个文件流}getPath,setPath: string;begingetPath := 'c:\temp\get.jpg'; {这个文件存在}setPath := 'c:\temp\set.jpg'; {这个会自动建立}getStream := TFileStream.Create(getPath, fmOpenRead or fmShareExclusive);setStream := TFileStream.Create(setPath, fmCreate);getStream.Position := 0; {流指针移到开始, 复制时从这里开始}setStream.CopyFrom(getStream, getStream.Size); {Copy 流}{CopyFrom 的第二个参数是要复制的内容大小; 如果为0 , 不管指针在什么位置都会复制所有内容}getStream.Free;setStream.Free;end;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////一个实例:读取流中的图片数据,显示图片/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////typeTForm1 = class(TForm)img1: TImage;procedure FormShow(Sender: TObject);private{ Private declarations }public{ Public declarations }fstream:TFileStream;end;varForm1: TForm1;filename:string = '.\WeiMir.uib';implementation{$R *.dfm}procedure TForm1.FormShow(Sender: TObject); varbmp:Tbitmap;beginfstream:=Tfilestream.create(filename,fmOpenRead); fstream.Seek(0,soFromBeginning);bmp:=TBitmap.Create;bmp.LoadFromStream(fstream);img1.Picture.Bitmap:=bmp;end;end.。
delphiidftp控件用法
delphiidftp控件⽤法delphi idftp控件⽤法2011-04-25 22:22FTP是⼀个标准协议,它是在计算机和⽹络之间交换⽂件的最简单的⽅法。
FTP也是应⽤TCP/IP协议的应⽤协议标准。
FTP通常于将作者的⽂件上传⾄服务器,或从服务器上下传⽂件的⼀种普遍的使⽤⽅式作为⽤户,您可以⽤⾮常简单的DOS 界⾯来使⽤FTP,也可以使⽤由第三⽅提供的软件(如FLASHFXP)来对服务器的数据进⾏删除,重命名等操作。
当然,使⽤这些之前,必须先要登录服务器,⽤指定的⽤户名和密码或匿名(Anonymous)登录。
这些⼤家都知道,不过还是讲⼀下。
⽤DOS操作FTP我不讲了。
我今天主要⽤INDY组件⾥的IDFTP控件做⼀FTP客户端软件(⾮常简单)了我现在讲⼀下IDFTP控件的⼏个属性如下:Host:FTP服务器地址。
USER:⽤户帐号。
Password:密码。
Passive:⽤于控制FTP数据连接⽅法。
FTP的数据传输可以有主动和被动。
PORT是主动模式,在建⽴数据通道时,服务端去连接别⼈;PASV是被动模式,在建⽴数据通道时,服务端被别⼈连接;建⽴数据通道时,⽤PORT模式还是PASV模式,选择权在于FTP客户端。
IDFTP⾥的passive是⼀个Boolean数据类型。
当True时为主动;当false时为被动。
Port:FTP服务的默认端⼝是21。
TransferType:传输⽂件的类型,可以取值为FtBinary(8位的任意⽂件)和FtAscii(7位的⽂本⽂件)。
SystemDesc:FTP服务器的描述。
IDFTP的⼏个⽅法常⽤的⽅法有以下⼏个:Connect:连接FTP服务器.Abort:停⽌FTP服务的操作。
Quit:关闭客户端与服务器的连接.Noop:⽤于保持连接的命令,防⽌被服务器关掉连接.List:获取FTP服务器上的⽂件和⽬录列表.原型为procedure List(ADest:TStrings;Const ASpecifier:String;const ADetails:Boolean);RetrieveCurrentDir:取得当前⽬录的名称.Site:发送FTP服务器的命令.原型为:procedure Site(const ACommand:string);ChangeDir:改变FTP服务器上的当前⽬录原型为: procedure ChangeDir(const ADirName:string);ChangeDirUp:将FTP服务器上的⽬录返回到你⽬录.温州-Dillon(86695893) 13:08:26MakeDir:在服务器上建⽴⼀个新⽬录.原型为:procedure MakeDir(const ADirName:String);RemoveDir:删除服务器上的⼀个⽬录.原型为:procedure RemoveDir(const ADirName:string);Get:从FTP服务器上下载⽂件.这个⽅法被重载了.原型为:procedure Get(const ASourceFile:string;ADest:TStream);overload;procedure Get(const ASourceFile:string;const ADest:string;ACanOverWrite:Boolean);overload;Put:⽤于向服务器上传⽂件.该⽅法被重载.原型为:procedure Put(const ASourceFile:TStream;const ADest:string;const Appand:Boolean);overload;procedure Put(const ASourceFile:string;const ADest:string;const AAppand:Boolean);overload;KillDataChannal:关闭FTP数据通道.所谓“重载”,就是当从多个“类”⾝上继承⼀些⽅法时,会发⽣冲突。
delphiidftpidhttp多线程多进度条
delphiidftpidhttp多线程多进度条idftp 上传多个⽂件同时上传,⽀持断点续传,多进度条。
起初⽤API做,发现对API了解太少,便改⽤线程类来处理,代码如下TThread1 = class(TThread)privatefCount, tstart, tlast: integer;tURL, tFile, temFileName,temLocalFile: string;tResume: Boolean;tStream: TFileStream;temFtp: TIdFTP;sFileName: string;pb: TProgressBar;bstate:Integer; //1,表⽰准备上传,2表⽰正在上传,3表⽰上传完成,4表⽰上传失败protectedprocedure Execute; override;publicconstructor create1(aURL, aFile, fileName,localfile: string; bResume: Boolean; Count,start, last: integer);procedure DownLodeFile(); //上传⽂件// function SetProgressInListView(lvw: TListView): Boolean; //在listview中动态创建进度条procedure StateChange; //上传状态改变procedure FtpUp;end;创建线程之前把进度条动态创建好,给进度条的Tag属性赋个唯⼀值,for i:=0 to iCount-1 dobeginSetProgressInListView(ListView1,i,1,10,3); // 创建进度条localfile:=ListView1.Items.Item[i].Caption;MyThread[i+1] := TThread1.create1('', '', '',localfile, false,i,2,1);end;constructor TThread1.create1(aURL, aFile, fileName,localfile: string; bResume: Boolean;Count, start, last: integer);vari:Integer;begininherited create(true); //设置为true 主要是为了调⽤resume 即创建线程时先不执⾏,调⽤thread1.resume执⾏线程。
Delphi使用TIdFtp控件实现FTP协议
Delphi使用TIdFtp控件实现FTP协议现在很多应用都需要上传与下载大型文件,通过HTTP方式上传大文件有一定的局限性。
幸好FTP作为一个非常老而且非常成熟的协议可以高效稳定地完成大文件的上传下载,并且可以完美地实现续传。
就拿我写的电影服务器管理端程序来说,各种方案比较后,发现使用FTP可以完美地实现要求。
但是要通过WinSocket库实现FTP比较麻烦,幸好有Indy--一个包装了大多数网络协议的组件包。
通过Indy,程序设计人员可以通过阻塞方式进行编程,可以抛开蹩脚的Winsocket异步模式,采用与Unix系统上等同的阻塞编程模式进行。
这样,程序员就可以很好的处理程序的运行流程。
下面,我们进入到Indy的TIdFtp世界。
1.控件的说明使用Indy 9中的TIdFtp控件可以实现通过FTP方式进行文件的上传与下载。
2.控件的具体使用(1)控件属性设置默认属性即可,与服务器连接直接相关的属性如主机名与用户等在建立连接时进行设定。
需要设定的是RecvBufferSize和SendBufferSize两属性的值。
另外需要根据要传输的文件类型指定TransferType属性,而其他属性按默认值设定即可。
RecvBufferSize说明(默认值为8192字节):该属性为整型变量,用于指定连接所用的接受缓冲区大小。
SendBufferSize说明(默认值为32768字节):该属性也为整型变量,用于指定连接所用的发送缓冲区的最大值。
该属性在WriteStream方法中时,可用于TStream指定要发送内容的块数。
如果要发送的内容大于本属性值,则发送内容被分为多个块发送。
TransferType说明(默认值为ftBinary):该属性为TIdFTPTransferType型变量。
用于指定传输内容是二进制文件(ftBinary )还是ASCII文件(ftASCII)。
应用程序需要使用二进制方式传输可执行文件、压缩文件和多媒体文件等;而使用ASCII方式传输文本或超文本等文本型数据。
delphi11.3中linuxpaserver源代码
delphi11.3中linuxpaserver源代码Delphi 11.3 LinuxPaserver源代码是一款在Linux平台上运行的软件开发工具。
它提供了一种有效的方法,开发人员可以在Linux系统上编写和调试Delphi程序,这为世界上最受欢迎的开发工具之一增添了新的功能和可移植性。
在本文中,我们将逐步回答关于Delphi 11.3 LinuxPaserver源代码的一些重要问题,以帮助读者更好地了解该工具的性能和功能。
第一步:什么是Delphi 11.3 LinuxPaserver源代码?Delphi 11.3 LinuxPaserver源代码是一种用于在Linux平台上开发和调试Delphi程序的开发工具。
它由Embarcadero Technologies开发,并在Delphi集成开发环境(IDE)中提供。
通过将Delphi代码编译为Linux 下的可执行代码,开发人员可以在Linux系统中运行和测试他们的应用程序,以确保其在不同平台上的兼容性和稳定性。
第二步:Delphi 11.3 LinuxPaserver源代码有哪些主要功能?Delphi 11.3 LinuxPaserver源代码提供了一套强大的功能,使开发人员能够在Linux系统上进行高效的编码和调试。
以下是它的主要功能:1. 支持多种Linux发行版:Delphi 11.3 LinuxPaserver源代码可以在多种流行的Linux发行版上运行,包括Ubuntu、CentOS和Red Hat Enterprise Linux等。
这使得开发人员能够根据自己的喜好和需求选择合适的操作系统进行开发。
2. 代码编辑和调试:该工具提供了一个强大的代码编辑器,具有代码自动完成、语法高亮和错误检查等功能,可以显著提高开发效率。
它还提供了强大的调试功能,允许开发人员在Linux系统上单步执行和跟踪他们的代码,以查找和解决错误。
3. GUI设计:Delphi 11.3 LinuxPaserver源代码支持图形用户界面(GUI)设计,开发人员可以轻松创建各种窗体、按钮、菜单等元素,并通过可视化工具进行布局和设计。
一个简易的FTP客户端软件 - Delphi编程
procedure RemoteFileListDblClick(Sender: TObject);
procedure DownLoadExecute(Sender: TObject);
GroupBox3: TGroupBox;
Panel1: TPanel;
LocalFileList: TListView;
DriveComboBox1: TDriveComboBox;
BitBtn2: TBitBtn;
Panel2: TPanel;
end;
var
FMain: TFMain;
implementation
{$R *.dfm}
procedure TFMain.FormCreate(Sender: TObject);
begin
IsTransParent:=false; //////IsTransParent为假,没有数据传输
IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ActnList, ImgList,
Menus, FileCtrl,IdFTPList;
type
TFMain = class(TForm)
IdFTP1: TIdFTP;
GroupBox1: TGroupBox;
HostName: TLabeledEdit;
Port: TLabeledEdit;
UserName: TLabeledEdit;
PassWord: TLabeledEdit;
BitBtn1: TBitBtn;
FTP文件上传源代码
FTP文件上传源代码(部分,原发)信息发布:[218.89.161.3] 发布日期:2006-4-19 0:00:00 阅读次数:563//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "UMFTP.h"#include "ULogin.h"#include "UUpLoad.h"#include "UAttr.h"#include "UAbout.h"#include "UMsg.h"#include "UNewFloder.h"#include "UReName.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma link "SUIButton"#pragma link "SUIForm"#pragma link "SUIImagePanel"#pragma link "SUIListView"#pragma link "SUIStatusBar"#pragma link "SUIToolBar"#pragma link "SUITreeView"#pragma link "SUIPopupMenu"#pragma resource "*.dfm"TFFTP *FFTP;//---------------------------------------------------------------------------__fastcall TFFTP::TFFTP(TComponent* Owner): TForm(Owner){}//---------------------------------------------------------------------------void __fastcall TFFTP::suiButton1Click(TObject *Sender){if(suiButton1->Caption=="连接服务器"){if(LoginToServer())suiButton1->Caption="断开服务器" ;}else{F->Disconnect();Connected=false;suiButton1->Caption="连接服务器" ;}}//---------------------------------------------------------------------------void __fastcall TFFTP::FormShow(TObject *Sender){FileList=new TList();P->Panels->Items[0]->Text="未连接";P->Panels->Items[1]->Text="";P->Panels->Items[2]->Text="";suiListView1->Enabled=false;suiButton2->Enabled=false;suiButton3->Enabled=false;suiButton4->Enabled=false;suiButton5->Enabled=false;suiButton6->Enabled=false;suiButton7->Enabled=false;suiButton9->Enabled=false;suiButton10->Enabled=false;Connected=false;IsBusy=false;}//---------------------------------------------------------------------------bool __fastcall TFFTP::LoginToServer(void){ bool s;s=false;FLogin=new TFLogin(NULL);if(FLogin->ShowModal()==mrOk)//用户登录{ZuoYe=Trim(FLogin->suiEdit1->Text);StuName=Trim(FLogin->suiEdit3->Text);if(!Connected){F->Connect();Connected=true;}F->ChangeDir("/");ClearList();F->List();if(CkZuoYe()){F->ChangeDir("/"+ZuoYe);ClearList();F->List();if(CkUser()==false)F->MakeDirectory(StuName);P->Panels->Items[0]->Text="已连接";P->Panels->Items[1]->Text="作业号:"+ZuoYe;P->Panels->Items[2]->Text="姓名:"+StuName;F->ChangeDir(StuName);Statue=1;ClearList();F->List();UserPath=F->CurrentDir;suiListView1->Enabled=true;SelectItem=NULL;IsBusy=false;s=true;}else{ShowMessage("你输入的作业号有误,请重新输入!");Statue=0;}}delete FLogin;return s;}void __fastcall TFFTP::FSuccess(TCmdType Trans_Type) { FileAttr *D;AnsiString s;switch(Trans_Type){ case cmdList:if(Statue==1)//用户列表{ListToView();P->Panels->Items[3]->Text="文件数:"+IntToStr(FileList->Count);SelectItem=NULL;}break;case cmdChangeDir:if(UserPath==F->CurrentDir){suiButton9->Enabled=false;suiButton10->Enabled=false;}else{suiButton9->Enabled=true;suiButton10->Enabled=true;}case cmdMakeDir:break;}}//---------------------------------------------------------------------------void __fastcall TFFTP::FConnect(TObject *Sender){Statue=0;}//---------------------------------------------------------------------------void __fastcall TFFTP::FDisconnect(TObject *Sender){P->Panels->Items[0]->Text="未连接";P->Panels->Items[1]->Text="";P->Panels->Items[2]->Text="";P->Panels->Items[3]->Text="";P->Panels->Items[4]->Text="";suiListView1->Enabled=false;SelectItem=NULL;suiButton2->Enabled=false;suiButton3->Enabled=false;suiButton4->Enabled=false;suiButton5->Enabled=false;suiButton6->Enabled=false;suiButton7->Enabled=false;suiButton9->Enabled=false;suiButton10->Enabled=false;}//---------------------------------------------------------------------------void __fastcall TFFTP::FListItem(AnsiString Listing) {FileAttr *File;File=new FileAttr;SplitFileName(Listing,File);FileList->Add((void *)File);}//---------------------------------------------------------------------------bool __fastcall TFFTP::CkZuoYe(void){//检查作业号是否存在FileAttr *D;bool j=false;for(int i=0;i<FileList->Count;i++){D=(FileAttr *)FileList->Items[i];if(D->Name==ZuoYe&&D->IsDir){j=true;break;}}return j;}bool __fastcall TFFTP::CkUser(void){//检查用户文件夹是否存在FileAttr *D;bool j=false;for(int i=0;i<FileList->Count;i++){D=(FileAttr *)FileList->Items[i];if(D->Name==StuName&&D->IsDir){j=true;break;}}return j;}void __fastcall TFFTP::SplitFileName(AnsiString S, FileAttr * F) {//划分文件信息AnsiString Dir;F->Date=S.SubString(0,8);F->Time=S.SubString(11,7);Dir=S.SubString(25,5);if(Trim(Dir)=="<DIR>"){F->IsDir=true;F->Size=-1;}else{F->IsDir=false;F->Size=StrToInt(Trim(S.SubString(31,8)));}F->Name=Trim(S.SubString(39,S.Length()-38));}void __fastcall TFFTP::FormClose(TObject *Sender, TCloseAction &Action){ClearList();delete FileList;}//---------------------------------------------------------------------------void __fastcall TFFTP::ClearList(void){//清除文件列表FileAttr *D;for(int i=0;i<FileList->Count;i++){D=(FileAttr *)FileList->Items[i];delete D;D=NULL;}FileList->Clear();}void __fastcall TFFTP::FFailure(bool &Handled, TCmdType Trans_Type){//IsBusy=false;}//---------------------------------------------------------------------------void __fastcall TFFTP::ListToView(void){ //列表到ListViewFileAttr *D;TListItem *V;suiListView1->Items->Clear();for(int i=0;i<FileList->Count;i++){D=(FileAttr *)FileList->Items[i];V=suiListView1->Items->Add();V->Caption=D->Name;V->ImageIndex=D->IsDir;}}void __fastcall TFFTP::suiButton2Click(TObject *Sender){//上传文件if(IsBusy)return;IsBusy=true;if(OpenDialog1->Execute()){FUpLoad->suiProgressBar1->Position=0;FUpLoad->Show();FUpLoad->Label1->Caption="正在上传文件:"+ExtractFileName(OpenDialog1->FileName)+",请稍候。
FTP服务器源代码C语言
FTP服务器端源代码:// Mini FtpServer.cpp : Defines the entry point for the console application. #include "stdafx.h"#include <string.h>#include <ws2tcpip.h>#include <stdlib.h>#pragma comment(lib,”ws2_32.lib”);#define WSA_RECV 0#define WSA_SEND 1#define DATA_BUFSIZE 8192#define MAX_NAME_LEN 128#define MAX_PWD_LEN 128#define MAX_RESP_LEN 1024#define MAX_REQ_LEN 256#define MAX_ADDR_LEN 80#define FTP_PORT 21 // FTP 控制端口#define DATA_FTP_PORT 20 // FTP 数据端口#define USER_OK 331#define LOGGED_IN 230#define LOGIN_FAILED 530#define CMD_OK 200#define OPENING_AMODE 150#define TRANS_COMPLETE 226#define CANNOT_FIND 550#define FTP_QUIT 221#define CURR_DIR 257#define DIR_CHANGED 250#define OS_TYPE 215#define REPLY_MARKER 504#define PASSIVE_MODE 227#define FTP_USER "toldo"#define FTP_PASS "toldo"#define DEFAULT_HOME_DIR "C:\\TEMP"#define MAX_FILE_NUM 1024#define MODE_PORT 0#define MODE_PASV 1#define PORT_BIND 1821typedef struct {CHAR buffRecv[DATA_BUFSIZE];CHAR buffSend[DATA_BUFSIZE];WSABUF wsaBuf;SOCKET s;WSAOVERLAPPED o;DWORD dwBytesSend;DWORD dwBytesRecv;int nStatus;} SOCKET_INF, *LPSOCKET_INF;typedef struct {TCHAR szFileName[MAX_PATH];DWORD dwFileAttributes;FILETIME ftCreationTime;FILETIME ftLastAccessTime;FILETIME ftLastWriteTime;DWORD nFileSizeHigh;DWORD nFileSizeLow;} FILE_INF, *LPFILE_INF;DWORD WINAPI ProcessTreadIO( LPVOID lpParam ) ;BOOL WelcomeInfo( SOCKET s );int LoginIn( LPSOCKET_INF pSocketInfo );int SendRes( LPSOCKET_INF pSI );int RecvReq( LPSOCKET_INF pSI );int DealCommand( LPSOCKET_INF pSI );int GetFileList( LPFILE_INF pFI, UINT nArraySize, const char* szPath ); char* GetLocalAddress();char* HostToNet( char* szPath ) ;char* NetToHost( char* szPath ) ;char* RelativeDirectory( char* szDir );char* AbsoluteDirectory( char* szDir );DWORD g_dwEventTotal = 0;DWORD g_index;WSAEVENT g_events[WSA_MAXIMUM_WAIT_EVENTS]; LPSOCKET_INF g_sockets[WSA_MAXIMUM_WAIT_EVENTS]; CRITICAL_SECTION g_cs;char g_szLocalAddr[MAX_ADDR_LEN];BOOL g_bLoggedIn;// 主函数,控制台程序开始的地方void main(void){WSADATA wsaData;SOCKET sListen, sAccept;SOCKADDR_IN inetAddr;DWORD dwFlags;DWORD dwThreadId;DWORD dwRecvBytes;INT nRet;InitializeCriticalSection(&g_cs);if (( nRet = WSAStartup(0x0202,&wsaData)) != 0 ) {printf("错误:WSAStartup failed with error %d\n", nRet);return;}// 先取得本地地址sprintf( g_szLocalAddr,"%s",GetLocalAddress() );if ((sListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET){printf("错误:Failed to get a socket %d\n", WSAGetLastError());WSACleanup();return;}inetAddr.sin_family = AF_INET;inetAddr.sin_addr.s_addr = htonl(INADDR_ANY);inetAddr.sin_port = htons(FTP_PORT);if (bind(sListen, (PSOCKADDR) &inetAddr, sizeof(inetAddr)) == SOCKET_ERROR) {printf("错误:bind() failed with error %d\n", WSAGetLastError());return;}if (listen(sListen, SOMAXCONN)){printf("错误:listen() failed with error %d\n", WSAGetLastError());return;}printf("Mini Ftpserver已经启动\n");printf("Mini Ftpserver开始侦听\n");if ((sAccept = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET){printf("错误:Failed to get a socket %d\n", WSAGetLastError());return;}//创建第一个手动重置对象if ((g_events[0] = WSACreateEvent()) == WSA_INVALID_EVENT){printf("错误:WSACreateEvent failed with error %d\n", WSAGetLastError());return;}// 创建一个线程处理请求if (CreateThread(NULL, 0, ProcessTreadIO, NULL, 0, &dwThreadId) == NULL) {printf("错误:CreateThread failed with error %d\n", GetLastError());return;}g_dwEventTotal = 1;while(TRUE){//处理入站连接if ((sAccept = accept(sListen, NULL, NULL)) == INVALID_SOCKET){printf("错误:accept failed with error %d\n", WSAGetLastError());return;}//回传欢迎消息if( !WelcomeInfo( sAccept ) ) break;//设置ftp根目录if( !SetCurrentDirectory( DEFAULT_HOME_DIR ) ) break;//操作临界区,防止出错EnterCriticalSection(&g_cs);//创建一个新的SOCKET_INF结构处理接受的数据socket.if ((g_sockets[g_dwEventTotal] = (LPSOCKET_INF)GlobalAlloc(GPTR,sizeof(SOCKET_INF))) == NULL){printf("错误:GlobalAlloc() failed with error %d\n", GetLastError());return;}//初始化新的SOCKET_INF结构char buff[DATA_BUFSIZE]; memset( buff,0,DATA_BUFSIZE );g_sockets[g_dwEventTotal]->wsaBuf.buf = buff;g_sockets[g_dwEventTotal]->wsaBuf.len = DATA_BUFSIZE;g_sockets[g_dwEventTotal]->s = sAccept;memset(&(g_sockets[g_dwEventTotal]->o),0, sizeof(OVERLAPPED));g_sockets[g_dwEventTotal]->dwBytesSend = 0;g_sockets[g_dwEventTotal]->dwBytesRecv = 0;g_sockets[g_dwEventTotal]->nStatus = WSA_RECV; // 接收//创建事件if ((g_sockets[g_dwEventTotal]->o.hEvent = g_events[g_dwEventTotal] = WSACreateEvent()) == WSA_INVALID_EVENT){printf("WSACreateEvent() failed with error %d\n", WSAGetLastError());return;}//发出接受请求dwFlags = 0;if (WSARecv(g_sockets[g_dwEventTotal]->s,&(g_sockets[g_dwEventTotal]->wsaBuf), 1, &dwRecvBytes, &dwFlags,&(g_sockets[g_dwEventTotal]->o), NULL) == SOCKET_ERROR){if (WSAGetLastError() != ERROR_IO_PENDING){printf("错误:WSARecv() failed with error %d\n", WSAGetLastError());return;}}g_dwEventTotal++;//离开临界区LeaveCriticalSection(&g_cs);//使第一个事件有信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//连接FTP
var
i:integer;
tr : Tstrings;
IdFTP1.Quit;
tr := TStringlist.Create;
IdFTP1.Host := hostTxt.Text; //FTP服务器地址 172.20.16.76
IdFTP1.Port := StrToInt(PortTxt.Text); //FTP服务器端口号9500
ername := UserTxt.Text; //FTP服务器用户名
IdFTP1.Password := pwdTxt.Text; //FTP服务器密码
IdFTP1.Connect(); //连接到ftp
IdFTP1.ChangeDir('JMPZ');
IdFTP1.List(tr); //得到目录下所有文件列表
FFTxt.Items.Assign(tr);
tr.Free;
//ftp当前路径,从登陆用户的起始目录起始
IdFTP1.RetrieveCurrentDir
//ftp目录变换,DirName只能是上一目录,或者下一目录,无需加"/"
IdFTP1.ChangeDir(DirName);
idftp_Client.Connected// 判断是否连接
//要使用IdFTP1.DirectoryListing属性,必须uses IdAllFTPListParsers;否则会有no idftplistparse classes have been registered的错误
//===========================================================
UseMLIS为目录解析器相关的参数,不同的Ftp服务器,会有不同的格式
//使用idftp1.list命令获取的目录列表时,显示列表为
drw-rw-rw- 1 user group0 Jun 2619:30 JMPZ
drw-rw-rw- 1 user group0 Jun 2619:31加密配置
若进入二级目录,则多显示两行
drw-rw-rw- 1 user group0 Jun 2619:30 .
drw-rw-rw- 1 user group0 Jun 2619:30 ..
drw-rw-rw- 1 user group0 Apr 509:420旧订单
drw-rw-rw- 1 user group0 Apr 509:2911rrrrrrrr
但是当参数eMLIS:= true;时,显示列表为
Type=dir;Modify=20170626113034;Win32.ea=0x00000010; JMPZ
Type=dir;Modify=20170626113101;Win32.ea=0x00000010; 加密配置
若进入二级目录,则多显示行
Type=cdir;Modify=20170626113034;Win32.ea=0x00000010; /JMPZ
Type=dir;Modify=20170405014212;Win32.ea=0x00000010; 0旧订单
Type=dir;Modify=20170405012904;Win32.ea=0x00000010; 11rrrrrrrr
Type=dir;Modify=20170608010420;Win32.ea=0x00000010; 4501036094
或者(不同的Ftp服务器,会有不同的格式)
11-16-1604:59PM <DIR> aspnet_client
06-28-1709:06AM <DIR> H_I
11-15-1608:43AM <DIR> H_P
09-30-1508:43AM <DIR> JMPZ
09-22-1503:52PM <DIR> USB_Driver_Windows
//=================================================================
//上传文件,要保证FTP路径正确,文件夹存在,默认会覆盖
uses IdFTPCommon;//ftBinary
IdFTP1.Put('本地文件及路径', AnsiToUtf8('FTP文件夹相对路径'));
IdFTP1.TransferType := ftBinary;
IdFTP1.Put('1.txt', AnsiToUtf8('4501036094\Main.txt'));
//================================================================
//创建文件夹,调试模式下,会报错
try
IdFTP1.ChangeDir('000');
except
IdFTP1.MakeDir('000');
IdFTP1.ChangeDir('000');
end;
//===================================================================== =
//判断文件是否存在
if idftp1.Size('ip.bin')=-1then
begin
NoteFlag('下载失败',clred);Exit;
end;
//==================================================================== //下载文件夹内的所有文件及文件夹
procedure TForm1.DownloadDirectory(var idFTP: TIdFtp;LocalDir, RemoteDir: string);
var
i,DirCount: Integer;
strName: string;
begin
if Copy(LocalDir,Length(LocalDir),1)<>'\'then
LocalDir:=LocalDir+'\';
if not DirectoryExists(LocalDir + RemoteDir) then
begin
CreateDirectory(PChar(LocalDir + RemoteDir),nil); //创建一个全路径的文件夹
LogTxt.Lines.Add('建立目录:' + LocalDir + RemoteDir);
end;
idFTP.ChangeDir(AnsiToUtf8(RemoteDir));
idFTP.TransferType := ftASCII;
idFTP.List(nil);
DirCount := idFTP.DirectoryListing.Count;
for i := 0to DirCount - 1do
begin
strName := Utf8ToAnsi(idFTP.DirectoryListing.Items[i].FileName);
LogTxt.Lines.Add('解析文件:' + strName);
if idFTP.DirectoryListing.Items[i].ItemType = ditDirectory then
if (strName = '.') or (strName = '..') then
Continue
else
begin
DownloadDirectory(idFTP,LocalDir + RemoteDir + '\', strName);
idFTP.ChangeDir('..');
idFTP.List(nil);
end
else
begin
if (ExtractFileExt(strName) = '.txt') or (ExtractFileExt(strName) = '.html') or (ExtractFileExt(strName) = '.htm') then
idFTP.TransferType := ftASCII //文本模式
else
idFTP.TransferType := ftBinary; //二进制模式
idFTP.Get(AnsiToUtf8(strName), LocalDir + RemoteDir + '\' + strName, True);
LogTxt.Lines.Add('下载文件:' + strName);
end;
Application.ProcessMessages;
end;
end;
//调用
DownloadDirectory(idftp1,ExtractFilePath(Application.ExeName),'H_C');
//ExtractFilePath(Application.ExeName):下载到本地文件夹
//H_C:FTP的文件夹。