Perl удалить папку с файлами
если в вашем каталоге может быть много файлов, EnumerateFiles() более эффективно, чем GetFiles() , потому что, когда вы используете EnumerateFiles() вы можете начать перечислять его до возвращения всей коллекции, в отличие от GetFiles() где вам нужно загрузить всю коллекцию в память, прежде чем начать перечислять ее. Смотрите эту цитату здесь:
поэтому, когда вы работаете со многими файлами и каталогами, EnumerateFiles() может быть больше эффективный.
то же самое относится к EnumerateDirectories() и GetDirectories() . Таким образом, код будет:
для целей этого вопроса действительно нет причин использовать GetFiles() и GetDirectories() .
Да, это правильный способ сделать это. Если вы хотите дать себе " чистую "(или, как я предпочитаю называть ее," пустую " функцию), вы можете создать метод расширения.
Это позволит вам сделать что-то подобное..
следующий код очистит папку рекурсивно:
мы также можем показать любовь к LINQ:
обратите внимание, что мое решение здесь не является эффективным, потому что я использую Get*().ToList().ForEach(. ) который генерирует то же самое IEnumerable два раза. Я использую метод расширения, чтобы избежать этой проблемы:
Это метод расширения:
самый простой способ:
имейте в виду, что это может уничтожить некоторые разрешения на папку.
основываясь на hiteshbiblog, вы, вероятно, должны убедиться, что файл читается и записывается.
Если вы знаете, что нет подпапок, что-то вроде этого может быть самым простым:
каждый метод, который я пробовал, они потерпели неудачу в какой-то момент с системой.Ошибки ввода-вывода. Следующий метод работает наверняка, даже если папка пуста или нет, только для чтения или нет и т. д.
следующий код очистит каталог, но оставит там корневой каталог (рекурсивный).
В Windows 7, Если вы только что создали его вручную с помощью Проводника Windows, структура каталогов похожа на эту:
и запуск кода, предложенного в исходном вопросе, для очистки каталога C:\AAA, линия di.Delete(true) всегда терпит неудачу с IOException "каталог не пуст" при попытке удалить BBB. Вероятно, это связано с какими-то задержками/кэшированием в Проводнике Windows.
Given an expression that specifies an element or slice of a hash, delete deletes the specified elements from that hash so that exists on that element no longer returns true. Setting a hash element to the undefined value does not remove its key, but deleting it does; see exists .
In list context, usually returns the value or values deleted, or the last such element in scalar context. The return list's length corresponds to that of the argument list: deleting non-existent elements returns the undefined value in their corresponding positions. When a key/value hash slice is passed to delete , the return value is a list of key/value pairs (two elements for each item deleted from the hash).
delete may also be used on arrays and array slices, but its behavior is less straightforward. Although exists will return false for deleted entries, deleting array elements never changes indices of existing values; use shift or splice for that. However, if any deleted elements fall at the end of an array, the array's size shrinks to the position of the highest element that still tests true for exists , or to 0 if none do. In other words, an array won't have trailing nonexistent elements after a delete.
WARNING: Calling delete on array values is strongly discouraged. The notion of deleting or checking the existence of Perl array elements is not conceptually coherent, and can lead to surprising behavior.
Deleting from %ENV modifies the environment. Deleting from a hash tied to a DBM file deletes the entry from the DBM file. Deleting from a tied hash or array may not necessarily return anything; it depends on the implementation of the tied package's DELETE method, which may do whatever it pleases.
The delete local EXPR construct localizes the deletion to the current block at run time. Until the block exits, elements locally deleted temporarily no longer exist. See "Localized deletion of elements of composite types" in perlsub.
The following (inefficiently) deletes all the values of %HASH and @ARRAY:
And so do these:
But both are slower than assigning the empty list or undefining %HASH or @ARRAY, which is the customary way to empty out an aggregate:
The EXPR can be arbitrarily complicated provided its final operation is an element or slice of an aggregate:
Perldoc Browser is maintained by Dan Book (DBOOK). Please contact him via the GitHub issue tracker or email regarding any issues with the site itself, search, or rendering of documentation.
The Perl documentation is maintained by the Perl 5 Porters in the development of Perl. Please contact them via the Perl issue tracker, the mailing list, or IRC to report any issues with the contents or format of the documentation.
Вы уже научились создавать в Perl файл, открывая его для вывода через дескриптор файла. Сейчас ми освоим опасную процедуру удаления файлов (очень кстати для тринадцатой глави, не правда ли?).
Perl-функция unlink (названная по имени системного вызова POSIX) удаляет одно из имен файла (которнй может иметь и другие имена). Когда удаляется последнее имя файла и ни в одном процессе он не открыт, удаляется и сам файл. Это в точности соответствует тому, что делает UNIX-команда rm. Поскольку у файла часто бывает только одно имя (если ви не создавали жесткие сснлки), то в большинстве случаев удаление имени можно считать удалением файла. Приняв это допущенне, покажем, как удалить файл fred, а затем удалить файл, имя которого вводится во время выполнения программы:
Функция unlink может принимать также список имен, подлежащих удалению:
Операция выполняется в списочном контексте и создает список имен файлов, которые совпадают с образцом. Это именно то, что нужно передать в unlink.
Функция unlink возвращает количество успешно удаленных файлов. Если указан только один аргумент и соответствующий ему файл удаляется, то возвращается единица; в противном случае возвращается нуль. Если заданы имена трех файлов, но удалить можно только два, то возвращается два. Установить, какие именно файлы были удалены, на оснований возвра-щенного значения невозможно, поэтому если вам нужно определить, какой файл не удален, удаляйте их по одному. Вот как производится удаление всех обьектных файлов (имена которых заканчиваются на .о) с выдачей сообще-ния об ошибке для каждого файла, который удалить нельзя:
Если unlink возвращает 1 (это означает, что единственный указанный файл был удален), то функция warn пропускается. Если имя файла не может быть удалено, результат "О" означает "ложь", поэтому warn выполняется. Абстрактно это можно прочитать так: "удали этот файл или сообщи мне о нем".
Если функция unlink дается без аргументов, то по умолчанию вновь используетея переменная $_. Так, приведеними выше цикл можно записать следующим образом:
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
В настоящее время я пытаюсь удалить в каталоге все файлы старше 90 дней. Единственное решение, которое я могу придумать, - это больше работать, чем я считаю необходимым. Есть ли быстрый и простой способ сделать это? Если вы работали с этим кодом:
Обратите внимание, что метод maxdepth() говорит: «Не переходить в подкаталоги». Установите для него значение 0 , если хотите просматривать поддиректории.
Кроме того, если вы хотите указать конкретное имя, вы можете добавить метод name() , который будет принимать регулярные выражения и работать только с этими файлами. например: name('*.2016*')
Вот моя функция, чтобы узнать возраст файла в Perl:
Просто подключите это и передайте имя файла. Это также может быть полезно для других пользователей, которые могут наткнуться на этот вопрос.
Вы можете узнать возраст файла в днях с помощью проверки файла -M . Из -X
-M Время запуска скрипта минус время модификации файла в днях.
Остальное - получить список файлов.
Поскольку это не обязательно должно быть рекурсивным, вот пример с opendir + readdir.
Указанное выше добавление пути необходимо, поскольку readdir возвращает простое имя файла без пути. Перед фактическим удалением вы можете включить различные тесты. (И, пожалуйста, всегда сначала проверяйте код .)
В версиях до Perl 5.12 голый readdir не устанавливал $_ , о чем идет речь в use 5.012 выше. Для этих версий нам нужно сделать
Мы можем прочитать каталог одним оператором, если сначала мы хотим получить список всех файлов.
Это связано с тем, что readdir возвращается в зависимости от контекста, в котором он вызван. Поскольку его вывод здесь назначен массиву, он вызывается в контексте списка и возвращает список всех записей в каталог. Поскольку имена файлов относятся к этому каталогу, мы также можем сразу map указать полный путь к ним.
Теперь перейдите unlink по своим критериям или отфильтруйте их, чтобы получить готовый список
Которые все могут быть поглощены внутри map
Поскольку пустой список () сглаживается в списке возврата, фактически исчезает.
Другой способ - использовать glob.
Если я вас правильно понял, вы хотите удалить все файлы старше 90 дней в каталоге /test/dir . Я не понимаю, для чего нужен my $dateDir /test/dir/*"'
интересно, какой самый простой способ удалить каталог со всеми его файлами в нем?
Я использую rmdir(PATH . '/' . $value); чтобы удалить папку, однако, если внутри нее есть файлы, я просто не могу ее удалить.
есть по крайней мере два варианта, доступных в настоящее время.
перед удалением папки удалите все файлы и папки (и это означает рекурсию!). Вот пример:
и если вы используете 5.2+ вы можете использовать RecursiveIterator, чтобы сделать это без необходимости делать рекурсию себе:
обычно я использую это для удаления всех файлов в папке:
и тогда вы можете сделать
каков самый простой способ удалить каталог со всеми его файлами в нем?
короткая функция, которая выполняет эту работу:
Я использую его в классе Utils, как это:
С большой силой приходит большая ответственность: когда вы вызываете эту функцию с пустым значением, она удаляет файлы, начинающиеся с root ( / ). В качестве гарантии вы можете проверить, пуст ли путь:
это более короткая версия отлично работает для меня
алгоритм, описанный там (который работал как шарм в моем случае):
здесь у вас есть одна хорошая и простая рекурсия для удаления всех файлов в исходном каталоге, включая этот каталог:
функция основана на рекурсии, сделанной для копирования каталога. Вы можете найти эту функцию здесь: скопируйте все содержимое каталога в другой с помощью php
вы можете использовать Symfony это файловой системы (код):
однако я не мог удалить некоторые сложные структуры каталогов с помощью этого метода, поэтому сначала вы должны попробовать его, чтобы убедиться, что он работает правильно.
Я мог бы удалить указанную структуру каталогов, используя конкретную реализацию Windows:
И просто для полноты, вот мой старый код:
Я предпочитаю это, потому что он по-прежнему возвращает TRUE, когда он преуспевает, и FALSE, когда он терпит неудачу, а также предотвращает ошибку, когда пустой путь может попытаться удалить все из"/*".
Читайте также: