Ошибка mkpath, если каталог уже существует? - PullRequest
1 голос
/ 02 сентября 2011

Я пытаюсь отладить проблему на машине друга.Я написал скрипт для копирования некоторых файлов, и он использует mkpath (я знаю, что mkpath является дряхлым, а теперь есть make_path, но я использую более старую версию perl).

На моем компьютере (с такой же версией perl, операционной системой и т. Д.) Скрипт работает нормально даже в условиях, когда каталоги уже существуют.

Однако

Когда я пытаюсь запустить скрипт на компьютере моего друга, mkpath выдает ошибку при вызове уже существующих каталогов!

Выдает ошибку: «mkdir: File существующие»

Я довольно озадачен тем, почему скрипт работает на моей машине, а не на его.

Спасибо, Фарид

РЕДАКТИРОВАТЬ, ДОБАВИТЬ БОЛЬШЕ ПОЛЕЗНОЙ ИНФОРМАЦИИ

Хорошо, вот несколькодругие вещи, помогающие диагностировать эту проблему

  1. Мы используем одну и ту же версию Perl и File.Оба хранятся в репозитории Perforce, поэтому мы на 100% используем одну и ту же версию

  2. Я копирую файлы в общую сетевую систему.Следовательно, путь к файлу имеет тип: \\NETWORK-COMP/Directory1/Directory2/Directory3

  3. Скрипт перебирает кучу файлов и копирует их.Файл first всегда успешно копируется, однако для 2-го файла происходит сбой с ошибкой

    mkdir \ NETWORK-COMP / Directory1 Файл существует

Directory1 - это не файл, а фактически GUID, и нет коллизий (я проверяю дважды каждый раз)!

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Та же ОС?Та же версия Perl?Хм ....

Я видел это сообщение об ошибке, когда в пути, который он пытается создать, есть существующий файл.Например, я пытаюсь создать каталог foo/bar/bar/foo, но есть файл foo/bar/bar, mkpath завершится неудачно с сообщением об ошибке, которое вы сказали.

Возможно ли, что это так?Попробуйте эту небольшую тестовую программу на вашем компьютере:

Выполните следующую команду в обеих системах:

$ perldoc -lm File::Path

Это выведет расположение файла :: Pathмодуль, который включен.Я подозреваю, что вы не запускаете модуль File :: Path, который вам кажется.

После того, как вы определили фактические используемые модули, проверьте, согласны ли эти два модуля.Кроме того, пока вы это делаете, сделайте perl -V (это заглавная V).Это даст вам много информации о ваших установках Perl, включая libpath, используется posix.Вполне возможно, что вы скомпилировали Perl с тем же исходным кодом, но флаги компиляции отличались.

Попробуйте эту тестовую программу на обеих системах:

use strict;
use warnings;
use File::Path;

open (FOO, ">foo") or die qq(Things really aren't going your way\n);
print FOO "THIS\n";
close FOO;

if (my $value = mkpath "foo/foo/bar/foo") {
    print "It worked: $value !\n";
} else {
    print "It didn't: $value !\n";
}
print "And the program continues\n";

Этот должен ошибка, потому что я создаю файл foo, а затем пытаюсь указать путь foo/boo/bar/foo.На самом деле я получаю следующую ошибку:

mkdir foo: File exists at ./test.pl line 11

Одна из этих вещей даст нам подсказку, что происходит.

1 голос
/ 03 сентября 2011

Я подозреваю, что часть пути существует, но это не каталог.

$ echo foo >foo

$ perl -MFile::Path -e'mkpath "foo"'
mkdir foo: File exists at -e line 1

Другая возможность состоит в том, что две машины имеют разные версии File :: Path, и одна имеетошибка в этом.Если это так, вы можете просто обновить File-Path .


Третья возможность заключается в том, что вы вводите неверные данные на одной из машин.Я получаю

mkdir PATH: File exists

, но вы получаете

mkdir : File exists

Это может быть из-за разницы в версии, но я так не думаю из-за пробела перед ":».Проверьте ваш ввод, используя Data :: Dumper (после выполнения $Data::Dumper::Useqq = 1;), чтобы убедиться, что вы передаете то, что, как вы думаете, вы передаете.

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