Indy ftp(服务端)控件如何指定用户的目录?最好有例子!
解决方案 »
- delphi中,mxOutlookBarPro 和哪个控件配合使用好?
- 在delphi如何对 http://xxx.xxx.xxx.xxx/xxx.aspx?xm=张三 中的汉字编码?
- 表有3个属性:价格,数量,总额。在DBGridEh显示出来,但只要求给用户修改价格和数量,系统就可以得到总额并更新。请问改怎么实现?
- 如何实现真正的四舍五入函数????????????!!!!!!!!!!!!
- 以前在网上看到的文章“delphi vs vc++”不知道大家看过没有!!!(3)
- canvas显示怎么同时显示单词和指定行距显示
- qichreport中的分组合计问题?急!!!
- 是不是PB的程序员特别大方,DELPHI的程序员就特别小气?????
- 在SQL SERVER 的数据库设计期,可以修改表中某个字段的名称或删除这个字段,如何在程序中做到这一点呢,用什么语句?
- 如何将程序设计成随IE启动而自动运行?
- 我觉得有点难且有趣的问题:怎样用SQL语言返回结果,使DBCHART形成饼图?
- 问大家一个问题,急~~
userAccount.UserName := 'nick';
userAccount.Password := '123';
userAccount.Attributes.Add('d:\common\');
//Sunheart
unit FtpMain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ImgList, Menus, ComCtrls, ToolWin, StdCtrls, Buttons,
ActnList, FileCtrl, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdFTP, IdFTPList, StrUtils, INIFiles, FtpTop, ManSite;type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
CoolBar1: TCoolBar;
ToolBar1: TToolBar;
N1: TMenuItem;
Images: TImageList;
Panel1: TPanel;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
MeMsg: TMemo;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
BitDiscon: TBitBtn;
BitConnect: TBitBtn;
CIsAnon: TCheckBox;
EPort: TEdit;
EUserName: TEdit;
EPassword: TEdit;
CHostName: TComboBox;
ActionLs: TActionList;
Connects: TAction;
Disconn: TAction;
DownLoad: TAction;
UpLoad: TAction;
LocalDirUp: TAction;
RemoteDirUp: TAction;
LocalChangeDir: TAction;
RemoteChangeDir: TAction;
LocalDel: TAction;
RemoteDel: TAction;
LocalNewDir: TAction;
RemoteNewDir: TAction;
LocalRename: TAction;
RemoteRename: TAction;
LocalRefresh: TAction;
RemoteRefresh: TAction;
StatusBar1: TStatusBar;
GroupBox3: TGroupBox;
QueueList: TListView;
GroupBox4: TGroupBox;
Panel2: TPanel;
Splitter1: TSplitter;
Splitter2: TSplitter;
GroupBox5: TGroupBox;
Panel6: TPanel;
Panel8: TPanel;
Panel3: TPanel;
DriveCB: TDriveComboBox;
LocalFileList: TListView;
Panel5: TPanel;
Panel7: TPanel;
ComboHistory: TComboBox;
RemoteFileList: TListView;
SpLocalDirUp: TSpeedButton;
SpRemoteDirUp: TSpeedButton;
SpUpload: TSpeedButton;
SpLocalDel: TSpeedButton;
SpLocalRename: TSpeedButton;
SpLocalMakeDir: TSpeedButton;
SpLocalRefresh: TSpeedButton;
SpDownload: TSpeedButton;
SpRemoteDel: TSpeedButton;
SpRemoteRename: TSpeedButton;
SpRemoteMakeDir: TSpeedButton;
SpRemoteRefresh: TSpeedButton;
TheExit: TAction;
SpExit: TSpeedButton;
LocalInf: TLabel;
RemoteInf: TLabel;
PopLocal: TPopupMenu;
PopRemote: TPopupMenu;
PopQueue: TPopupMenu;
L1: TMenuItem;
N2: TMenuItem;
L2: TMenuItem;
N3: TMenuItem;
D1: TMenuItem;
N4: TMenuItem;
F1: TMenuItem;
N5: TMenuItem;
R1: TMenuItem;
U1: TMenuItem;
N6: TMenuItem;
L3: TMenuItem;
N7: TMenuItem;
D2: TMenuItem;
N8: TMenuItem;
F2: TMenuItem;
N9: TMenuItem;
R2: TMenuItem;
SpConn: TSpeedButton;
SpDisc: TSpeedButton;
SpSites: TSpeedButton;
SpHelp: TSpeedButton;
SpAbout: TSpeedButton;
N10: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N24: TMenuItem;
SFtp: TIdFTP;
N25: TMenuItem;
A1: TMenuItem;
ImageLs: TImageList;
TheHelp: TAction;
TheAbout: TAction;
ControlBar1: TControlBar;
ControlBar2: TControlBar;
Imgs: TImageList;
M1: TMenuItem;
ControlBar3: TControlBar;
N11: TMenuItem;
S1: TMenuItem;
SpSet: TSpeedButton;
procedure TheExitExecute(Sender: TObject);
procedure LocalDirUpExecute(Sender: TObject);
procedure RemoteDirUpExecute(Sender: TObject);
procedure ConnectsExecute(Sender: TObject);
procedure RemoteChangeDirExecute(Sender: TObject);
procedure LocalFileListDblClick(Sender: TObject);
procedure DownLoadExecute(Sender: TObject);
procedure UpLoadExecute(Sender: TObject);
procedure LocalChangeDirExecute(Sender: TObject);
procedure LocalNewDirExecute(Sender: TObject);
procedure RemoteDelExecute(Sender: TObject);
procedure RemoteNewDirExecute(Sender: TObject);
procedure DriveCBChange(Sender: TObject);
procedure RemoteFileListDblClick(Sender: TObject);
procedure RemoteRenameExecute(Sender: TObject);
procedure DisconnExecute(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure LocalRenameExecute(Sender: TObject);
procedure LocalDelExecute(Sender: TObject);
procedure RemoteRefreshExecute(Sender: TObject);
procedure LocalRefreshExecute(Sender: TObject);
procedure CIsAnonClick(Sender: TObject);
procedure L1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect;
Selected: Boolean);
procedure FormCreate(Sender: TObject);
procedure ComboHistoryChange(Sender: TObject);
procedure TheAboutExecute(Sender: TObject);
procedure M1Click(Sender: TObject);
procedure SpAboutClick(Sender: TObject);
procedure SpSitesClick(Sender: TObject);
procedure CHostNameChange(Sender: TObject);
procedure CHostNameClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SpSetClick(Sender: TObject);
procedure S1Click(Sender: TObject);
procedure SpHelpClick(Sender: TObject);
private
{ Private declarations }
IsTransParent:Boolean;
LocalPath:String;
public
{ Public declarations }
end;var
MainForm: TMainForm;
PresentSite:String;implementationuses FtpSet, FtpHelp;{$R *.dfm}function TheSize(sizes:Int64):String;
var
tmp:Real;
TheUnit:String;
begin
if sizes<1024 then
begin
tmp:=sizes;
TheUnit:=' B';
end
else
if sizes<1024*1024 then
begin
tmp:=sizes/1024;
TheUnit:=' KB';
end
else
if sizes<1024*1024*1024 then
begin
tmp:=sizes/(1024*1024);
TheUnit:=' MB';
end
else
begin
tmp:=sizes/(1024*1024*1024);
TheUnit:=' GB';
end;
Result:=Format('%.2f',[tmp])+TheUnit;
end;function GetAFileExt(FileName:String):String;
var
TheExt:String;
begin
Result:='';
TheExt:=UpperCase(Trim(ExtractFileExt(FileName)));
Result:=(RightStr(TheExt,Length(TheExt)-1)+' 文件');
end;function PrintTheError(TheError:String):Integer;
begin
MainForm.MeMsg.Lines.Add('出错信息('+DateTimeToStr(Now)+'):');
MainForm.MeMsg.Lines.Add(' '+TheError);
Result:=1;
end;procedure DrawItem(Item:TMenuItem; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
i,xb:integer;
begin
ACanvas.Font := Screen.IconFont;
ACanvas.Brush.Color := clBtnFace;
ACanvas.FillRect(ARect);
ACanvas.TextOut(ARect.Left+20,ARect.Top+4,Item.Caption);
if Selected then
begin
xb:=0;
for i:=0 to ARect.Right do
begin
ACanvas.Brush.Color :=clTeal+i*$100;
ACanvas.FillRect(Rect(xb,ARect.Top,xb+1,ARect.Bottom));
inc(xb);
end;
ACanvas.Font.Color:=clWhite;
SetBkMode(ACanvas.Handle,TRANSPARENT);
ACanvas.TextOut(ARect.Left+20,ARect.Top+4,Item.Caption);
end;
MainForm.Images.Draw(ACanvas,ARect.Left+1,ARect.Top+1,Item.ImageIndex,true);
end;
begin
if SFtp.Connected then
if MessageDlg('是否中止当前的连接和下载过程?',mtCustom,[mbYes,mbNo],0)=mrYes then
begin
try
if IsTransParent then
SFtp.Abort;
SFtp.Quit;
except
On E:Exception do
begin
PrintTheError('中止当前下载过程时出错,'+E.Message);
Exit;
end;
end;
end
else
Exit;
Halt;
end;procedure TMainForm.LocalDirUpExecute(Sender: TObject);
begin
if length(LocalPath)=3 then Exit;
LocalPath:=LocalPath+'.txt';
LocalPath:=ExtractFileDir(LocalPath);
LocalChangeDirExecute(Sender);
end;procedure TMainForm.RemoteDirUpExecute(Sender: TObject);
begin
if SFtp.Connected then
begin
if (ComboHistory.Text='/') or (ComboHistory.Text='') then Exit;
try
SFtp.ChangeDirUp;
ComboHistory.ItemIndex:=ComboHistory.Items.IndexOf(SFtp.RetrieveCurrentDir);
RemoteChangeDirExecute(Sender);
except
On E:Exception do
begin
PrintTheError('返回上层目录出错,'+E.Message);
Exit;
end;
end;
end;
end;procedure TMainForm.ConnectsExecute(Sender: TObject);
var
i:integer;
begin
if SFtp.Connected then
DisConnExecute(Sender);
if SFtp.Connected then Exit;
MeMsg.Lines.Add('正在连接FTP站点:'+CHostName.Text+'...');
try
if Trim(CHostName.Text)='' then
begin
PrintTheError('FTP主机地址为空!');
Exit;
end;
if not TryStrToInt(Trim(EPort.Text),i) then
begin
PrintTheError('您输入的端口号非法!');
Exit;
end;
if EPort.Text='' then
EPort.Text:='21';
if EUserName.Text='' then
EUserName.Text:='Anonymous';
if EPassword.Text='' then
EPassword.Text:='[email protected]';
SFtp.Username:=EUserName.Text;
SFtp.Password:=EPassword.Text;
SFtp.Host:=CHostName.Text;
SFtp.Port:=StrToInt(EPort.Text); SFtp.Connect;
MeMsg.Lines.AddStrings(SFtp.LoginMsg.Text);
ComboHistory.Clear;
ComboHistory.Items.Add('/');
ComboHistory.ItemIndex:=0;
RemoteChangeDirExecute(Sender);
except
On E:Exception do
begin
PrintTheError('连接出错,'+E.Message);
Exit;
end;
end;
end;procedure TMainForm.RemoteChangeDirExecute(Sender: TObject);
var
LS:TStringList;
FileCount:Integer;
newItem:TListItem;
FolderCount:Integer;
TheName:String;
FileNum,FolderNum,AllSize:Integer;
begin
FileNum:=0;
FolderNum:=0;
AllSize:=0;
FolderCount:=1;
if not SFtp.Connected then Exit;
try
LS:=TStringList.Create;
SFtp.ChangeDir(ComboHistory.Text);
RemoteFileList.Items.Clear;
newItem:=RemoteFileList.Items.Add;
newItem.ImageIndex:=2;
newItem.Caption:='上层目录';
SFtp.List(LS);
for FileCount:=0 to LS.Count-1 do // Iterate
begin
TheName:=SFtp.DirectoryListing.Items[FileCount].FileName;
if (TheName<>'.') and (TheName<>'..') then
begin
if SFtp.DirectoryListing.Items[FileCount].ItemType=ditDirectory then
begin
FolderNum:=FolderNum+1;
newItem:=RemoteFileList.Items.Insert(FolderCount);
newItem.ImageIndex:=0;
newItem.SubItems.Add('');
newItem.SubItems.Add('文件夹');
end
else
begin
FileNum:=FileNum+1;
newItem:=RemoteFileList.Items.Add;
newItem.ImageIndex:=1;
newItem.SubItems.Add(TheSize(SFtp.DirectoryListing.Items[FileCount].Size));
newItem.SubItems.Add(GetAFileExt(SFtp.DirectoryListing.Items[FileCount].FileName));
AllSize:=AllSize+SFtp.DirectoryListing.Items[FileCount].Size;
end;
newItem.Caption:=SFtp.DirectoryListing.Items[FileCount].FileName;
newItem.SubItems.Add(DateTimeToStr(SFtp.DirectoryListing.Items[FileCount].ModifiedDate));
newItem.SubItems.Add(SFtp.DirectoryListing.Items[FileCount].OwnerPermissions);
end;
end; // for
RemoteInf.Caption:=IntToStr(FolderNum)+'个文件夹,'+IntToStr(FileNum)+'个文件,共'+TheSize(AllSize)+#10+'FTP站点说明:'+PresentSite;
except
on E: Exception Do
begin
ComboHistory.Items.Delete(ComboHistory.ItemIndex);
ComboHistory.ItemIndex:=ComboHistory.Items.IndexOf(GetCurrentDir);
PrintTheError('打开文件列表出错,'+E.Message);
Ls.Free;
Exit;
end;
end;
Ls.Free;
end;procedure TMainForm.LocalFileListDblClick(Sender: TObject);
var
FileName:String;
begin
if LocalFileList.Selected=nil then Exit;
if LocalFileList.Selected.Index=0 then
begin
LocalDirUpExecute(Sender);
Exit;
end;
FileName:=LocalFileList.Selected.Caption;
if LocalFileList.Selected.SubItems[1]='文件夹' then
begin
if Length(LocalPath)=3 then
LocalPath:=LocalPath+FileName
else
LocalPath:=LocalPath+'\'+FileName;
LocalChangeDirExecute(Sender);
end
else
begin
if not SFtp.Connected then Exit;
if MessageDlg('是否上传该文件?',mtCustom,[mbYes,mbNo],0)=mrYes then
try
UpLoadExecute(Sender);
except
On E:Exception do
PrintTheError('上传文件"'+fileName+'"出错,'+E.Message);
end;
end;
end;procedure TMainForm.DownLoadExecute(Sender: TObject);
var
FileName:String;
Item:TListItem;
QueueItem:TListItem;
begin
if not SFtp.Connected then Exit;
if RemoteFileList.Selected=nil then Exit;
if RemoteFileList.Selected.SubItems[1]='文件夹' then Exit;
Item:=RemoteFileList.Selected;
QueueList.Clear; while Item<>nil do
begin
QueueItem:=QueueList.Items.Add;
QueueItem.ImageIndex:=1;
QueueItem.Caption:='';
QueueItem.SubItems.Add(Item.Caption);
QueueItem.SubItems.Add(Item.SubItems[0]);
QueueItem.SubItems.Add(Item.SubItems[1]);
QueueItem.SubItems.Add(LocalPath);
QueueItem.SubItems.Add('');
QueueItem.SubItems.Add('');
QueueItem.SubItems.Add('<-');
QueueItem.SubItems.Add(ComboHistory.Text);
Item:=RemoteFileList.GetNextItem(Item,sdAll,[isSelected]);
end; // while
QueueList.Refresh; RemoteFileList.Enabled:=False;
ComboHistory.Enabled:=False;
RemoteDirUp.Enabled:=False;
IsTransParent:=True;
try
while QueueList.Items.Count>0 do
begin
FileName:=QueueList.Items[0].SubItems[0];
QueueList.Items[0].SubItems[4]:='正在下载';
QueueList.Refresh;
try
if FileExists(FileName) then
begin
if MessageDlg('文件已经存在,是否继续?',mtCustom,[mbYes,mbNo],0)=mrYes then
SFtp.Get(FileName,LocalPath+'\'+FileName,False,True)
else
SFtp.Get(FileName,LocalPath+'\'+FileName,True);
end
else
SFtp.Get(FileName,LocalPath+'\'+FileName,False);
except
On E:Exception do
PrintTheError('下载文件"'+FileName+'"出错,'+E.Message);
end;
QueueList.Items[0].Delete;
QueueList.Refresh;
LocalChangeDirExecute(Sender);
end;
RemoteFileList.Enabled:=True;
ComboHistory.Enabled:=True;
RemoteDirUp.Enabled:=True;
IsTransParent:=False;
except
On E:Exception do
begin
QueueList.Items[0].SubItems[4]:='错误';
PrintTheError('下载文件"'+FileName+'"出错,'+E.Message);
RemoteFileList.Enabled:=True;
ComboHistory.Enabled:=True;
RemoteDirUp.Enabled:=True;
IsTransParent:=False;
end;
end;
end;
var
FileName:String;
Item:TListItem;
QueueItem:TListItem;
begin
if not SFtp.Connected then Exit;
if LocalFileList.Selected=nil then Exit;
Item:=LocalFileList.Selected;
QueueList.Clear;
while Item<>nil do
begin
QueueItem:=QueueList.Items.Add;
QueueItem.ImageIndex:=1;
QueueItem.Caption:='';
QueueItem.SubItems.Add(Item.Caption);
QueueItem.SubItems.Add(Item.SubItems[0]);
QueueItem.SubItems.Add(Item.SubItems[1]);
QueueItem.SubItems.Add(SFtp.Host+ComboHistory.Text);
QueueItem.SubItems.Add('→');
QueueItem.SubItems.Add('');
QueueItem.SubItems.Add('');
QueueItem.SubItems.Add(LocalPath);
Item:=LocalFileList.GetNextItem(Item,sdAll,[isSelected]);
end;
QueueList.Refresh; LocalFileList.Enabled:=False;
DriveCB.Enabled:=False;
RemoteFileList.Enabled:=False;
ComboHistory.Enabled:=False;
RemoteDirUp.Enabled:=False;
IsTransParent:=True;
try
while QueueList.Items.Count>0 do
begin
FileName:=QueueList.Items[0].SubItems[0];
QueueList.Items[0].SubItems[4]:='正在上传';
QueueList.Refresh;
SFtp.Put(LocalPath+'\'+FileName,FileName);
RemoteChangeDirExecute(Sender);
QueueList.Items[0].Delete;
QueueList.Refresh;
end; // while
LocalFileList.Enabled:=True;
DriveCB.Enabled:=True;
RemoteFileList.Enabled:=True;
ComboHistory.Enabled:=True;
RemoteDirUp.Enabled:=True;
IsTransParent:=False;
except
On E:Exception do
begin
QueueList.Items[0].ImageIndex:=4;
QueueList.Items[0].SubItems[4]:='错误';
PrintTheError('上传'+FileName+'出错,'+E.Message);
LocalFileList.Enabled:=True;
DriveCB.Enabled:=True;
RemoteFileList.Enabled:=True;
ComboHistory.Enabled:=True;
RemoteDirUp.Enabled:=True;
IsTransParent:=False;
end;
end;
end;procedure TMainForm.LocalChangeDirExecute(Sender: TObject);
var
sr:TSearchRec;
Item:TListItem;
FileCount,FolderCount:Integer;
AllSize:Integer;
begin
FileCount:=0;
FolderCount:=0;
AllSize:=0;
SetCurrentDir(LocalPath);
LocalFileList.Clear;
Item:=LocalFileList.Items.Add;
Item.ImageIndex:=2;
Item.Caption:='上层目录';
if FindFirst('*',faDirectory,sr)=0 then
begin
repeat
if ((sr.Attr and faDirectory)=sr.Attr) and (sr.Name<>'.') and (sr.Name<>'..') then
begin
FolderCount:=FolderCount+1;
Item:=LocalFileList.Items.Add;
Item.ImageIndex:=0;
Item.Caption:=sr.Name;
Item.SubItems.Add('');
Item.SubItems.Add('文件夹');
Item.SubItems.Add(DateTimeToStr(FileDateToDateTime(sr.Time)));
end;
until FindNext(sr)<>0;
FindClose(sr);
end; if FindFirst('*',faArchive,sr)=0 then
begin
repeat
FileCount:=FileCount+1;
Item:=LocalFileList.Items.Add;
Item.ImageIndex:=1;
Item.Caption:=sr.Name;
Item.SubItems.Add(TheSize(sr.Size));
Item.SubItems.Add(GetAFileExt(sr.Name));
Item.SubItems.Add(DateTimeToStr(FileDateToDateTime(sr.Time)));
AllSize:=AllSize+sr.Size;
until FindNext(sr)<>0;
FindClose(sr);
end;
LocalInf.Caption:=IntToStr(FolderCount)+'个文件夹,'+IntToStr(FileCount)+'个文件,共'+TheSize(AllSize)+#10+LocalPath+' (可用磁盘空间:'+TheSize(DiskFree(0))+'/共:'+TheSize(DiskSize(0))+')';
end;procedure TMainForm.LocalNewDirExecute(Sender: TObject);
var
NewFolder:String;
begin
NewFolder:=InPutBox('新建文件夹','请输入文件夹名:','');
if NewFolder<>'' then
try
CreateDir(NewFolder);
except
On E:Exception do
begin
PrintTheError('创建本地文件夹出错,'+E.Message);
Exit;
end;
end;
LocalChangeDirExecute(Sender);
end;procedure TMainForm.RemoteDelExecute(Sender: TObject);
var
FileName:String;
begin
if not SFtp.Connected then Exit;
if RemoteFileList.Selected=nil then Exit;
FileName:=RemoteFileList.Selected.Caption;
if RemoteFileList.Selected.SubItems[0]='文件夹' then
SFtp.RemoveDir(FileName)
else
SFtp.Delete(FileName);
RemoteChangeDirExecute(Sender);
end;procedure TMainForm.RemoteNewDirExecute(Sender: TObject);
var
NewFolder:String;
begin
if not SFtp.Connected then Exit;
NewFolder:=InputBox('新建文件夹','请输入文件夹名:','');
if NewFolder<>'' then
try
SFtp.MakeDir(NewFolder);
RemoteChangeDirExecute(Sender);
except
On E:Exception do
begin
PrintTheError('新建文件夹出错,'+E.Message);
Exit;
end;
end;
end;procedure TMainForm.DriveCBChange(Sender: TObject);
begin
LocalPath:=DriveCb.Drive+':\';
LocalChangeDirExecute(Sender);
end;procedure TMainForm.RemoteFileListDblClick(Sender: TObject);var
FileName:String;
begin
if not SFtp.Connected then Exit;
if RemoteFileList.Selected=nil then Exit;
if RemoteFileList.Selected.Index=0 then
begin
RemoteDirUpExecute(Sender);
Exit;
end;
FileName:=RemoteFileList.Selected.Caption;
if RemoteFileList.Selected.SubItems[1]='文件夹' then
begin
if ComboHistory.ItemIndex=0 then
FileName:='/'+FileName
else
begin
FileName:=ComboHistory.Items[ComboHistory.ItemIndex]+'/'+FileName;
end;
if ComboHistory.Items.IndexOf(FileName)=-1 then
ComboHistory.Items.Add(FileName);
ComboHistory.ItemIndex:=ComboHistory.Items.IndexOf(FileName);
RemoteChangeDirExecute(Sender);
end
else
if MessageDlg('是否下载该文件?',mtCustom,[mbYes,mbNo],0)=mrYes then
DownLoadExecute(Sender);
end;
鸽飞,可不可以说的清楚一些,假如我是在ListDirectoryListing中指定用户的目录。
up