Perl: получить имя файла с учетом регистра - PullRequest
0 голосов
/ 22 января 2019

У меня есть Perl-скрипт, который должен работать на любой платформе (Windows, Mac, Linux, ...).Часть его функциональности заключается в переименовании файлов, но я не хочу, чтобы он перезаписывал существующие файлы.Допустим, скрипт называется «my_rename» и принимает те же аргументы, что и функция «переименовать», а пользователь выполняет эту команду:

my_rename test.txt test.TXT

Проблемапроисходит, если -e "test.txt" и -e "test.TXT" оба возвращают true.Вот как я хотел бы справиться с этой ситуацией при следующих условиях:

Случай 1: В чувствительной к регистру файловой системе:

  • прерывается с ошибкой «test.TXT»существует

Случай 2: На файловой системе без учета регистра, когда фактический регистр существующего имени файла - "test.TXT":

  • выдает предупреждение, что имя файлане изменяется

Случай 3: для файловой системы без учета регистра, когда фактический регистр существующего имени файла НЕ "test.TXT":

  • переименовать файл в "test.TXT "

Поскольку этот сценарий должен быть переносимым, он не может полагаться на системные функции или утилиты.

Любые предложения приветствуются.

  • Фил

1 Ответ

0 голосов
/ 22 января 2019

То, что я сделал здесь в прошлом, - это пропустите -e и перейдите прямо к readdir.

. На входе вы должны знать, сколько нечувствительных к регистру совпадений с readdir.

if (! -e $input)
{
  die "No such file: $input";
}

my $input_case_insensitive_matches = () = use_readdir_to_find($input);
my $output_is_case_match = use_readdir_to_find($output);

if ($input_case_insensitive_matches > 1 && $output_is_case_match)
{
  # case sensitive filesystem, target exists, as does the input file
  die "$output already exists";
}

if ($output_is_case_match)
{
  # case insensitive filesystem, no change required
  warn "$input is already $output";
}
else
{
  # case can be changed
  rename $input, $output;
}

Вероятно, потребуется некоторая отладка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...