请教:一个递归算法问题 + 两个Tk问题 + 两个文件copy问题

请教:一个递归算法问题 + 两个Tk问题 + 两个文件copy问题

请教:一个递归算法问题 + 两个Tk问题 + 两个文件copy问题
偶在用Perl-tk写一个图形化的ftp客户端工具,纯粹是想练手,可是遇到一些问题,请各位大侠帮
帮忙(屏幕截图:[url]http://jelle.go.nease.net/perl/PerlSkills.htm[/url]):

1. 以前看过一个ioi老兄写的用ftp下载整个目录的递归算法,大致如下,可是偶刚才好好看了看
,好像有bug, 他只能适用于每个目录中只有最多一个子目录的情形,如果有多个则会漏掉。因为
一旦一个目录中的内容浏览完后就会退出递归循环。偶没学过算法,如何解决呢???请高人指点,感激不尽!

sub putdir {
my $file = shift;
if($file !~ m/\/$/) {
$file = $file . "\/";
}

$ftp -> mkdir($file);
opendir(FDR, "$file");
@tmpfile = grep{/^[^\.]/} readdir(FDR);
closedir(FDR);
chomp $_ foreach (@tmpfile);
@tmpdir = ();

foreach (@tmpfile) {
push @tmpdir, $_ if -d $file . $_;
}

for($num = 0; $num < @tmpfile; $num++) {
$tmpname = $tmpfile[$num];
$tmpfile[$num] = $file . $tmpfile[$num];

if(isdir($tmpname, @tmpdir) == 0) {
$ftp -> put($tmpfile[$num], $tmpfile[$num]);
}
else {
putdir($tmpfile[$num]);
}
}
}

2. Tk::DialogBox好像也有bug: 设置好defaultbutton后,如果是用键盘tab键切换焦点到其他按钮上再回车,虽然看到的是这个按钮被按下,可是实际激活的还是defaultbutton,难道要自己重新写一个模块? --- (我已经用messageBox代替,但想知道为什么)

#!/usr/bin/perl -w

use Tk;
use Tk::DialogBox;

$mw = MainWindow -> new(-title => 'DialogBox Demo');

$answer = "Press the button to show dialogbox first\nAnd use keyboard(<tab>) move the focus to \"No\".\nThen press \"Enter\" to continue.";
$mw -> Label(-textvariable => \$answer) -> pack;

$mw -> Button(-text => 'Show DialogBox', -command => \&show_dialog) -> pack();

MainLoop;

sub show_dialog {
$dialog = $mw -> DialogBox(-title => 'Hello', -buttons => ['Yes', 'No']);
$dlg_ans = $dialog -> Show;
$answer = "You select: $dlg_ans";
}

3. 在Tk::DialogBox中好像不能用$widget -> focus指定焦点,焦点始终在defaultbutton上,怎么办?

4. File::Copy模块好像不能对整个文件夹进行操作,如果想copy, mv整个文件夹而不用shell命令
该怎么做?

5. Net::FTP模块好像没有copy, mv远程文件/目录的功能,如果想实现这一功能该怎么办?

万分感谢!




   

[CCB]3[/CCB]幸...
[CCB]3[/CCB]幸好不是我写的那一个.
1:--写成子进...
1:
写成子进程,然后重复调用自己……
例如:
sub puttree {
my $path = shift;
for ( <$path/*> ) {
if ( -d ) {
$ftp->mkdir($_);
puttree("$path/$_");
}
elsif ( -f ) {
$ftp->put($_,$dst);
}
...
}
....
}

2:
不要用回车,用空格……

4:
参考1




   

subs: --多谢...
subs:
多谢你的回复!

1. 上面的方法也是写入子过程,然后重复递归调用自己。在你的例子第三行开始的for循环遍历目录下所有文件/文件夹,一旦一个文件夹遍历完成即会退出循环,好像和上面的一样。
比如:
/Dir1
|____ Dir11
| |_____ File11
| |_____ File12
|
|____ Dir12
|_____ File21
|_____ File22

首先
for (Dir11, Dir12) {由于Dir11是目录, 因此重新调用自己}。

接着重新调用自己执行
for(File1, File2) {File1, File2 都是普通文件,直接get}。

到此for循环完毕,退出子过程,Dir12还是被遗漏,我说得对吗。

2. 是的用空格键可以,为什么回车不行呢,看上去也是"No"被按下,可是返回的值却还是"Yes"...[CCB]10[/CCB]

jftp v1.0 beta屏幕截图: [url]http://jelle.go.nease.net/perl/PerlSkills.htm[/url]




   

其实有一个很简...
1:
其实有一个很简单的方法(汗~~):

use File::Find;
find(\&put,$dir);

2:
这个也很简单,将-default_button设成什么都没有:
$dialog = $mw -> DialogBox( ... ,-default_button=>'' )




   

恩,用File::Fi...
恩,用File::Find是可以实现本地目录的遍历,也就是说put整个目录已经解决了,多谢subs兄,
可是File::Find不能操作远程目录,要get整个目录咋办呢?