Я пишу модуль SFTP, используя класс Java (Да. Я знаю, что это глупо. Да, я знаю о Net :: SFTP. Политически, почему мы должны делать это так).
Базовая Java-программа имеет в основном несколько классов для получения, размещения, перечисления и удаления файла с сервера.В этих вызовах вы должны указать каталог и файл.Нет способа выйти за пределы вашего исходного каталога.Вы застряли, отслеживая сами.
Я решил, что было бы неплохо, если бы я отслеживал ваш удаленный каталог и создал метод Chdir, который отслеживает каталог, в котором вы находитесь, из корня FTP.Все, что я делаю - это сохраняю каталог внутри атрибута и использую его в других командах.Очень просто и работает.
Проблема в том, что имя хранимого каталога становится все длиннее и длиннее.Например, если каталог foo/bar/barfoo
, а вы делаете $ftp->Chdir("../..")
, ваш новый каталог будет foo/bar/barfoo/../..
, а не foo
.И то, и другое технически правильно, но первое чище и проще для понимания.
Мне нужен код, который позволит мне упростить имя каталога.Я думал об использовании File::Spec::canonpath
, но это конкретно говорит о том, что не делает это.Он ссылался на Cwd
, но это зависит от прямого доступа к машине, и я подключаюсь по FTP.
Я придумала следующий фрагмент кода, но ему действительно не хватает элегантности.Это должно быть проще и понятнее:
use strict;
use warnings;
my $directory = "../foo/./bar/./bar/../foo/barbar/foo/barfoo/../../fubar/barfoo/..";
print "Directory = $directory\n";
$directory =~ s{(^|[^.])\.\/}{$1}g;
print "Directory = $directory\n";
while ($directory =~ s{[^/]+/\.\.(/|$)}{}) {
print "Directory = $directory\n";
}
$directory =~ s{/$}{};
print "Directory = $directory\n";
Есть идеи?Я хотел бы избежать установки модулей CPAN.Их может быть чрезвычайно сложно установить на нашем сервере.