Страница 1 из 1

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

Добавлено: 06 Сентябрь 2014, 9:02
Игорь Столяров
Привет всем !

Можно как-нибудь БЫСТРО удалить большое кол-во файлов в заданной папке ?
Скорее всего - через 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 ощутимо тормозит ... :(
Заранее спасибо за любую наводку. :)

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

Добавлено: 06 Сентябрь 2014, 10:13
Дед Пахом
Даже этот код можно оптимизировать - например, убрать проверку If Exists.
Потом убрать остальные строчки (включая декларацию очереди) и оставить только одну:
Remove(LongPath(Clip(System{Prop:DataPath})) & 'Image\*.*')

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

Добавлено: 06 Сентябрь 2014, 10:20
Игорь Столяров
Согласен ... Но все равно операция последовательно удаляет по одному файлу последовательным перебором ... :(
Должна же быть в WinAPI команда очистки папки ... и что-то я ее не найду.

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

Добавлено: 06 Сентябрь 2014, 13:25
Дед Пахом
Посмотри API_Remove в clib.clw, хотя я думаю, стандартная REMOVE просто оболочка над ней.

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

Добавлено: 06 Сентябрь 2014, 17:15
Admin
Игорь Столяров писал(а):Можно как-нибудь БЫСТРО удалить большое кол-во файлов в заданной папке ?
Работает хорошо, но при Records(FIQ) > 10000 ощутимо тормозит ... :(
Заранее спасибо за любую наводку. :)
Ваш вариант - удаление в корзину

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

Добавлено: 06 Сентябрь 2014, 22:02
Tuko_G
А через RUN(''Del . /Q/S/F') не подаидет. :)

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

Добавлено: 07 Сентябрь 2014, 0:39
gopstop2007
Если удалить все файлы в директории, может переименовать и сразу создать такую же директорию, а потом удалять файлы, или просто удалить директорию командой RMDIR c:\blah /s /q и заново создать такую же :)

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

Добавлено: 07 Сентябрь 2014, 4:14
Admin
Как вариант запустить отдельный поток и в нем удалять по 10-100 файлов в цикле.
Остальная программа будет продолжать работать.
Это в случае если прямо сейчас не нужен "чистый" каталог.

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

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

Копаем дальше ...

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

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

PROGRAM

MAP
END

CODE
REMOVE('e:\xyz\abc\*.*')

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

Добавлено: 07 Сентябрь 2014, 21:30
Игорь Столяров
Так проверил есстессно ... под C63. Сейчас проверю еще под C8/C91 ...
Может дьявол, как обычно, спрятался в деталях ... ;)

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

Добавлено: 07 Сентябрь 2014, 22:35
Дед Пахом
Я под C8 проверял.

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

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

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

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

И это есть решение. Спасибо ! :)

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

Добавлено: 08 Сентябрь 2014, 10:31
kreator
Есть ещё функция в Clarion'е RemoveDirectory. Вызывает rmdir.

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

Добавлено: 08 Сентябрь 2014, 20:51
seawolf
только перед rmdir надо зачистить папку от файлов - иначе он не сработает (как -то вроде так)