Грохнуть все файлы

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Грохнуть все файлы

Сообщение Игорь Столяров »

Привет всем !

Можно как-нибудь БЫСТРО удалить большое кол-во файлов в заданной папке ?
Скорее всего - через WinAPI ... Сейчас пользуюсь следующим кодом:

Код: Выделить всё

FIQ         QUEUE,PRE(F_IQ)
Name          STRING(FILE:MAXFILENAME)
ShortName     STRING(13)
Date          LONG
Time          LONG
Size          LONG
Attrib        BYTE
            END

Loc:Count Long

     Code

     Free(FIQ)
     Directory(FIQ,LongPath(Clip(System{Prop:DataPath})) & 'Image\*.*', FF_:NORMAL)
     If Records(FIQ)
        Loop Loc:Count = 1 to Records(FIQ) by 1
          Get(FIQ,Loc:Count)

          If Clip(Left(FIQ.Name)) <> ''
             If Exists(LongPath(Clip(System{Prop:DataPath})) & 'Image\' & Clip(Left(FIQ.Name)))
                Remove(LongPath(Clip(System{Prop:DataPath})) & 'Image\' & Clip(Left(FIQ.Name)))
             end
          end
        end
     end
Работает хорошо, но при Records(FIQ) > 10000 ощутимо тормозит ... :(
Заранее спасибо за любую наводку. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Грохнуть все файлы

Сообщение Дед Пахом »

Даже этот код можно оптимизировать - например, убрать проверку If Exists.
Потом убрать остальные строчки (включая декларацию очереди) и оставить только одну:
Remove(LongPath(Clip(System{Prop:DataPath})) & 'Image\*.*')
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Грохнуть все файлы

Сообщение Игорь Столяров »

Согласен ... Но все равно операция последовательно удаляет по одному файлу последовательным перебором ... :(
Должна же быть в WinAPI команда очистки папки ... и что-то я ее не найду.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Грохнуть все файлы

Сообщение Дед Пахом »

Посмотри API_Remove в clib.clw, хотя я думаю, стандартная REMOVE просто оболочка над ней.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Грохнуть все файлы

Сообщение Admin »

Игорь Столяров писал(а):Можно как-нибудь БЫСТРО удалить большое кол-во файлов в заданной папке ?
Работает хорошо, но при Records(FIQ) > 10000 ощутимо тормозит ... :(
Заранее спасибо за любую наводку. :)
Ваш вариант - удаление в корзину
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Tuko_G
Бывалый
Сообщения: 95
Зарегистрирован: 09 Декабрь 2005, 10:47
Откуда: Tbilisi, Georgia
Контактная информация:

Re: Грохнуть все файлы

Сообщение Tuko_G »

А через RUN(''Del . /Q/S/F') не подаидет. :)
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Re: Грохнуть все файлы

Сообщение gopstop2007 »

Если удалить все файлы в директории, может переименовать и сразу создать такую же директорию, а потом удалять файлы, или просто удалить директорию командой RMDIR c:\blah /s /q и заново создать такую же :)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Грохнуть все файлы

Сообщение Admin »

Как вариант запустить отдельный поток и в нем удалять по 10-100 файлов в цикле.
Остальная программа будет продолжать работать.
Это в случае если прямо сейчас не нужен "чистый" каталог.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Грохнуть все файлы

Сообщение Игорь Столяров »

Дед Пахом писал(а):Remove(LongPath(Clip(System{Prop:DataPath})) & 'Image\*.*')
Нэ работает. Может быть оно и к лучшему ... :)
gopstop2007 писал(а):RMDIR c:\blah /s /q
Вот это точно делать не надо ... Ничего хорошего в DOS окнах нет, к тому же под Win x64 этот номер уже не пройдет. ;)

Копаем дальше ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Грохнуть все файлы

Сообщение Дед Пахом »

Игорь Столяров писал(а):
Дед Пахом писал(а):Remove(LongPath(Clip(System{Prop:DataPath})) & 'Image\*.*')
Нэ работает. Может быть оно и к лучшему ... :)
Копаем дальше ...
Ну проверь, делов-то:

PROGRAM

MAP
END

CODE
REMOVE('e:\xyz\abc\*.*')
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Грохнуть все файлы

Сообщение Игорь Столяров »

Так проверил есстессно ... под C63. Сейчас проверю еще под C8/C91 ...
Может дьявол, как обычно, спрятался в деталях ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Грохнуть все файлы

Сообщение Дед Пахом »

Я под C8 проверял.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Грохнуть все файлы

Сообщение Игорь Столяров »

Игорь Столяров писал(а):REMOVE('e:\xyz\abc\*.*')
Докладываю по существу вопроса.

В C63 - Ошибка 5 "Нет доступа".

В C91 - Все работает. Конкретные цифры не интересны, ибо зависят от системы, а вот отношение весьма радостное.
На 20 выборках от 30000 до 50000 файлов скорость выросла ... ровно на порядок (в 10 раз).

И это есть решение. Спасибо ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Re: Грохнуть все файлы

Сообщение kreator »

Есть ещё функция в Clarion'е RemoveDirectory. Вызывает rmdir.
We are hard at work… for you. :)
seawolf
Старожил
Сообщения: 213
Зарегистрирован: 08 Июль 2005, 11:23
Откуда: St. Petersburg

Re: Грохнуть все файлы

Сообщение seawolf »

только перед rmdir надо зачистить папку от файлов - иначе он не сработает (как -то вроде так)
Ответить