![]() |
Проверка списка имен в цикле
Добрый день.
Имеется папка с файлами определённой структуры: Код:
file001.sd Задача: Проверять все файлы в папке на последовательность. И в случае нарушения последовательности, выдавать ошибку. Например, если в последовательности file001 - file009 не будет файла file003 то выдавалась бы ошибка. Как я вижу решение данной задачи: Собрать все имена файлов в массив. А дальше для каждой последовательности создать свой цикл, со своим условием. Собрать файлы в массив я смогу, а вот написать условие для отработки цикла с трудом смогу. Помогите пожалуйста. |
Код:
Option Explicit |
Iska, Почему то скрипт упорно хочет найти file010.sd - которого быть не может т.к. после file009.sd идет файл file00a.sd
|
Цитата:
Код:
Option Explicit |
Iska, Вы правы. Просто я для теста скрипта скопировал половину файлов.
В таком случае как узнать, какой файл последний и прекратить выполнение скрипта на нём? Ведь файлов каждый раз может быть разное количество. Список может кончаться например и на file02b.sd и на file04s.sd или на другом имени. |
Цитата:
Цитата:
|
Iska, Быть может будет проще, посчитать общее количество файлов типа file*.sd и закончить цикл на шаге равном количеству файлов?
|
Цитата:
Цитата:
|
Iska, Работает! Но честно говоря не до конца понимаю как функция ExistLastName определяет что файл последний? За счет Step -1 ??
|
Угу. Тремя вложенными циклами генерирует имена файлов с конца (т.е., с «filezzz.sd») и проверяет их существование. Как только будет найден существующий файл — происходит выход из функции. Поскольку переменные «x», «y» и «z» передаются в параметры функции по ссылке, то значения этих переменных (а не их копий в случае передаче по значению) могут быть изменены внутри функции. Посему после выхода из функции мы имеем в переменных «x», «y» и «z» 36-тиричные цифробуквы, однозначно определяющие последний существующий файл в алфавитном порядке.
|
Iska, Большое спасибо! Весьма интересная реализация.
|
Iska, Кстати заметил проблему сейчас.
Новая версия скрипта(которая выдергивает имя последнего файла) работает немного не корректно. Сначала скрипт проверяет цифровые имена 001 - 090 Затем скрипт проверяет имена (буква цифра) 0a1 - 0z9 При этом скрипт не проверяет имена 01a - 09z а так же не проверяет 0aa - 0zz. Поэтому из 600 моих файлов, скрипт проверил только 100 и успешно завершился. Хотя старый скрипт, который не проверял последний файл (ваш пост №4), отрабатывал по всем 600 файлам. P.S. и в переменной arr10To36 две буквы g. |
Цитата:
Цитата:
|
Iska, я до тестирования исправил вторую g на j.
Последний скрипт по прежнему проходит по 100 файлам. А вот старый скрипт безупречно отрабатывает на всех 600 файлах.... единственный минус это то что он не знает о последнем файле. Проблема в том что мой последний файл это: file0h5.sd В первом скрипте проверка проходит последовательно: Сначала с 001 по 009 потом 00a - 00z затем с 010 - 019 и так далее. Поэтому он захватывает все 600 файлов. А вот новый скрипт, который проверяет имя последнего файла работает немного по другому: Сначала с 001 по 090 затем с 0a1 - 0z9 и дойдя до 0h5 (последний файл) успешно останавливается не захватывая остальные файлы с маской 01a - 09z и 0aa - 0zz. Поэтому он и отрабатывает всего около 100 файлов. Подозреваю что проблема в Код:
For i = 0 To x |
bombording, ясно. Я посмотрю.
|
Iska, может быть тогда действительно сделать на базе вашего первого варианта скрипта подсчет файлов по маске и условие по которому цикл будет прекращаться по истечению количества шагов равным количеству файлов ?
Я тут сделал данную проверку. Но к сожалению умения хватило только на подсчет файлов по расширению....а не по маске file*.sd Код:
Option Explicit |
Цитата:
Я создал весь перечень из 46655 [36^3 - 1] файлов: Затем проверил Ваше утверждение, ограничившись файлом «file0az.sd»: Я выделил существенные моменты: Видно, что после «file090.sd» идёт «file091.sd», а вовсе не «file0a1.sd», который идёт, как и положено, после «file0a0.sd». Цитата:
Таким образом, я пока не могу подтвердить сделанные Вами выводы. Скорее наоборот. Как мы можем поступить? Создайте перечень Ваших файлов: Код:
dir /b file*.sd >"List.txt" |
Вложений: 1
Цитата:
Первый отработает так (и это правильно, т.к. скрипт обработает все 617 файлов) file001.SD file002.SD file003.SD file004.SD file005.SD file006.SD file007.SD file008.SD file009.SD file00a.SD file00b.SD file00c.SD и т.д. Второй так (обработается только около 100 файлов из 617): file001.SD file002.SD file003.SD file004.SD file005.SD file006.SD file007.SD file008.SD file009.SD file010.SD file011.SD и т.д. |
bombording, кажись, дошло. Буду думать.
|
Цитата:
Пробуйте: Цитата:
|
ничо не понимаю)
Честно я бы на дельфи давно написал консольную утилиту у которой на входе имя файла, а она бы проверяла наличие файлов с именем+1 и именем-1. И выдавала errorlevel ) Запустил бы её просто для каждого файла циклом. |
Опиум, какая разница, на чём писать?! Я вот, например, тоже не пойму — Ваш алгоритм: при чём тут имя+1/имя-1 и errorlevel. Изложите его подробнее.
|
Iska, Все отлично работает. Скрипт проходит по всем файлам. Большое спасибо!
|
Iska, алгоритм простой, на входе утилиты имя файла, на выходе имена "соседей", наличие которых нужно проверить.
|
Цитата:
|
Iska, Добрый день. Прошу прощение за свою назойливость. Безумно признателен вам за подобное решение.
Возможно ли сделать так что бы скрипт искал файлы не по маске файла, а только по трем последним символам? Сейчас скрипт отлично ищет файлы по маске "file" & arr10To36(x) & arr10To36(y) & arr10To36(z) & ".sd", но маска файлов недавно поменялась на хаотичную и теперь нужно что бы скрипт работал вне зависимости от маски и искал файлы только по системе счисления (три последних символа в файле 001 ... 002 ... и т.д.) ^.*arr10To36(x) & arr10To36(y) & arr10To36(z) & "\.sd$" Код:
Option Explicit |
Как-то так:
|
Время: 05:13. |
Время: 05:13.
© OSzone.net 2001-