Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Как быстро удалить файл?   Найти похожие ветки 

 
rolex   (2006-02-16 17:13) [0]

Нужно очитстить каталог Temporaru Internet Files. Делаю это так:
1) если в корзину удалять:
function DeleteRecycled(dir:string):Boolean;
var
 fos:TSHFileOpStruct;
begin
 ZeroMemory(@fos,SizeOf(fos));
 with fos do
   begin
     wFunc:=FO_DELETE;
     fFlags:=FOF_SILENT or FOF_NOCONFIRMATION or FOF_ALLOWUNDO;
     pFrom:=PChar(dir+#0);
   end;
 Result:=(0=ShFileOperation(fos));
end;


2) безвозвратно:
function TForm1.DeleteF(dir:string):Boolean;
var
 fos:TSHFileOpStruct;
begin
 ZeroMemory(@fos,SizeOf(fos));
 with fos do
   begin
     wFunc:=FO_DELETE;
     fFlags:=FOF_SILENT or FOF_NOCONFIRMATION;
     pFrom:=PChar(dir+#0);
   end;
 Result:=(0=ShFileOperation(fos));
end;


Думаю вы все знаете что в этой папке несколько тысяч файлов. И удаление происходит ну ОООЧень долго и той и другой процедурой.
Как быть? Ведь если через винду удалять, то всё происходит гораздо быстрей!


 
Defunct ©   (2006-02-17 20:34) [1]

быстрее всего работает команда
deltree *.*


 
Джо ©   (2006-02-18 04:21) [2]

Создал только что 10000 файлов, функция DeleteFile в цикле удалила их практически мгновенно, примерно за 1 сек.


 
Defunct ©   (2006-02-18 04:56) [3]

Джо ©   (18.02.06 04:21) [2]
Это понятно, когда файлы нефрагментированы и каталоги нефрагментированы да еще и NTFS - удаление будет происходить быстро. А вот на FAT да с фрагментированнымим файлами и каталогами (internet temporary files - изобилует такими) удаление будет происходить долго.

Команды ОС Del/DelTree оптимизированы специально для быстрого удаления большого числа файлов - помечают сразу все файлы каталога как удаленные и после чего корректируют таблицу FAT с наименее возможным количеством обращений к диску. Попробуйте для интереса (только корзину отключить!) ;>


 
Джо ©   (2006-02-18 05:13) [4]

> [3] Defunct ©   (18.02.06 04:56)

Задумался. Может, так оно и есть, насчет системных комманд (кстати, в XP нету deltree, вместо нее rmdir /s). Удаляет, действительно, очень быстро.


 
Defunct ©   (2006-02-18 05:20) [5]

> кстати, в XP нету deltree,
быть такого не может

ps: у меня стоит XP (команду эту пользую) ;>


 
Джо ©   (2006-02-18 05:27) [6]

> [5] Defunct ©   (18.02.06 05:20)
> > кстати, в XP нету deltree,
> быть такого не может
>
> ps: у меня стоит XP (команду эту пользую) ;>


Прямо и не знаю, что сказать. Комманды у меня такой нету (SP2), вот выдержка из Help из раздела Unavailable MS-DOS Commands.

The following MS-DOS commands are not available at the command prompt.

Command - New procedure or reason for obsolescence
assign - Not currently supported.
backup - Not currently supported.
choice - Not currently supported.
ctty - Not currently supported.
dblspace - Not currently supported.
deltree - The rmdir /s command deletes directories containing files and subdirectories. For more information about the rmdir command, see Rmdir.
---
Само собой, что такую комманду знаю и во времена ДОС ее использовал. Сейчас не использую, и ее отсутствие обнаружил случайно. :)


 
Джо ©   (2006-02-18 05:33) [7]

Кстати, и вот такая мысль. Влияет ли дефрагментированность файлов на скорость их удаления? В любом случае, DeleteFile с самим файлом ничего не делает, а всего лишь делает соответствующие записи в таблице размещения файлов (как на NTFS — не представляю).


 
Defunct ©   (2006-02-18 05:41) [8]

MS Windows XP [Ver. 5.1.2600] (SP2)
да действительно
> help deltree    - не работает
а
> deltree
продолжает работать. А у вас как? что вообще "is not recognized"?


 
Джо ©   (2006-02-18 05:44) [9]

> [8] Defunct ©   (18.02.06 05:41)

Угу, "deltree" is not recognized as an internal or external command,
operable program or batch file.


 
Defunct ©   (2006-02-18 05:51) [10]

> а всего лишь делает соответствующие записи в таблице размещения файлов

и в корректирует запись в каталоге - стирает первую букву имени файла, т.о. помечая его как удаленный.

> Влияет ли дефрагментированность файлов на скорость их удаления?
влияет. если представить, что FAT - это отражение диска, то при удалении фрагментированной цепочки придется непоследовательно обращаться к разным секторам диска. А при непоследовательном чтении/записи секторов вступает в силу такой параметр диска как Avarage Seek, который всегда выше чем Track-to-Track seek.


 
Defunct ©   (2006-02-18 05:57) [11]

> Avarage Seek
*average...

> Угу, "deltree" is not recognized as an internal or external command,
надо же..
а какая версия ОС? может cmd неправильный?


 
Джо ©   (2006-02-18 06:12) [12]

> [11] Defunct ©   (18.02.06 05:57)
> а какая версия ОС? может cmd неправильный?

Windows XP prof., второй cервис-пак, Version 5.1.2600.
Коммандный процессор стандартный, да это и неважно, поскольку deltree это не внутренняя команда, реализована в DELTREE.EXE.


 
Defunct ©   (2006-02-18 06:21) [13]

Джо ©   (18.02.06 06:12) [12]
> Коммандный процессор стандартный, да это и неважно, поскольку deltree это не внутренняя команда, реализована в DELTREE.EXE.

Все, понял почему она у меня работает.
На винте установлен еще WinME, и в пути попала строка к WinME(шному)\Command
вот deltree из арсенала WinME и запускается под XP. Странно только, что не говорит о несовместимости версий.


 
Джо ©   (2006-02-18 06:23) [14]

> [13] Defunct ©   (18.02.06 06:21)

Ну, хоть с этим разобрались :)


 
rolex   (2006-02-18 09:59) [15]

Для безвозвратного удаления заменил:
function TForm1.DeleteF(dir:string):Boolean;
var
fos:TSHFileOpStruct;
begin
ZeroMemory(@fos,SizeOf(fos));
with fos do
  begin
    wFunc:=FO_DELETE;
    fFlags:=FOF_SILENT or FOF_NOCONFIRMATION;
    pFrom:=PChar(dir+#0);
  end;
Result:=(0=ShFileOperation(fos));
end;

на обычный DeleteFile, стало ГОРАЗДО быстрее.

А как быть с кодом, для удаления в корзину?
function DeleteRecycled(dir:string):Boolean;
var
fos:TSHFileOpStruct;
begin
ZeroMemory(@fos,SizeOf(fos));
with fos do
  begin
    wFunc:=FO_DELETE;
    fFlags:=FOF_SILENT or FOF_NOCONFIRMATION or FOF_ALLOWUNDO;
    pFrom:=PChar(dir+#0);
  end;
Result:=(0=ShFileOperation(fos));
end;

Может его тоже можно как-то разогнать?


 
Anatoly Podgoretsky ©   (2006-02-18 11:35) [16]

Джо ©   (18.02.06 06:12) [12]
Зато есть встроеные Del/Erase

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

C:\Documents and Settings\app>del /?
Удаление одного или нескольких файлов.

DEL [/P] [/F] [/S] [/Q] [/A[[:]атрибуты]] имена
ERASE [/P] [/F] [/S] [/Q] [/A[[:]атрибуты]] имена

 /S          Удаление указанных файлов из всех подкаталогов.


 
Джо ©   (2006-02-18 15:34) [17]

> [16] Anatoly Podgoretsky ©   (18.02.06 11:35)
> Джо ©   (18.02.06 06:12) [12]
> Зато есть встроеные Del/Erase

Это я знаю. Кроме того, у rmdir, как я писал, также есть ключ /s.


 
Джо ©   (2006-02-18 15:35) [18]

> [15] rolex   (18.02.06 09:59)
> А как быть с кодом, для удаления в корзину?
> ...
> Может его тоже можно как-то разогнать?

Не думаю, что это возможно, по крайней мере, докумментированными способами.


 
begin...end ©   (2006-02-18 16:54) [19]

> Defunct ©   (18.02.06 04:56) [3]

> Команды ОС Del/DelTree оптимизированы специально для быстрого
> удаления большого числа файлов - помечают сразу все файлы
> каталога как удаленные и после чего корректируют таблицу
> FAT с наименее возможным количеством обращений к диску.

Ой. Откуда информация?


 
Defunct ©   (2006-02-18 17:10) [20]

begin...end ©   (18.02.06 16:54) [19]

Ой, кто пришел!
из лесу вестимо.


 
begin...end ©   (2006-02-18 17:20) [21]

> Defunct ©   (18.02.06 17:10) [20]

Гы. Болеете?


 
Defunct ©   (2006-02-18 17:34) [22]

> begin...end ©   (18.02.06 17:20) [21]

нет, спасибо, все хорошо.
а вы?


 
begin...end ©   (2006-02-18 17:39) [23]

> Defunct ©   (18.02.06 17:34) [22]

> нет, спасибо, все хорошо.

Тогда почему в [20] дан такой ответ на вопрос?

> а вы?

Нет.


 
Defunct ©   (2006-02-18 18:21) [24]

> Тогда почему в [20] дан такой ответ на вопрос?

А разве можно ответить как-то по-другому на [19]?


 
begin...end ©   (2006-02-18 18:32) [25]

> Defunct ©   (18.02.06 18:21) [24]

Да, конечно. Например, можно ответить правду.


 
Defunct ©   (2006-02-18 18:56) [26]

> Да, конечно. Например, можно ответить правду.

Я вам уже говорил неоднократно - хотите конструктивного диалога, не задавайте двусмысленных вопросов. Знаете нечто больше - говорите сразу.
что обозначает "Ой." - удивление? сарказм?


 
begin...end ©   (2006-02-18 19:02) [27]

> Defunct ©   (18.02.06 18:56) [26]

> не задавайте двусмысленных вопросов.
А я их и не задаю. Вопрос в [19] вполне конкретен: "Откуда информация?". Никакой двусмысленности.

> Знаете нечто больше - говорите сразу.
Зачем?

> что обозначает "Ой." - удивление? сарказм?
Удивление. Это так важно?


 
Defunct ©   (2006-02-18 19:16) [28]

>> Знаете нечто больше - говорите сразу.
> Зачем?

Хотя бы для того, чтобы собеседнику было интересно с вами общаться.

> Вопрос в [19] вполне конкретен: "Откуда информация?". Никакой двусмысленности.
информация основана на анализе command.com ms-dos v 6.22.


 
begin...end ©   (2006-02-18 19:35) [29]

> Defunct ©   (18.02.06 19:16) [28]
> информация основана на анализе command.com ms-dos v 6.22.

Я не совсем понимаю, зачем сообщать информацию, относящуюся к MS-DOS, в обсуждении, относящемся к Windows XP.

В XP работа команды DEL, вызванной для удаления нескольких файлов, основана на функциях FindFirstFileW/FindNextFileW/FindClose и DeleteFileW. Поэтому, вопреки [3], вряд ли следует ожидать какого-либо ускорения работы за счёт использования этой команды по сравнению с ручным вызовом указанных функций.


 
Defunct ©   (2006-02-18 20:01) [30]

> Поэтому, вопреки [3], вряд ли следует ожидать какого-либо ускорения работы за счёт использования этой команды

Не настаиваю, но если вам не составит труда, а также интересен этот вопрос, то предлагаю вам написать и исследовать код из комбинации указанных вами функций, который мог бы сравниться по быстродействие с вышеназванными командами OS. Разумеется если у вас есть на это время и желание этим заняться.


 
app ©   (2006-02-18 20:18) [31]

А вас случайно персональная почта не имеется, если нет то для бедных к нас есть чат


 
begin...end ©   (2006-02-18 22:20) [32]

> Defunct ©   (18.02.06 20:01) [30]

Честно говоря, проверять очевидные вещи сильного желания нет.

Код на основе указанных мной функций может быть примерно таким:

function DelCommand(const Dir: string): Integer;
var
 FD: TWin32FindData;
 H: THandle;
begin
 Result := 0;
 H := FindFirstFile(PChar(Dir + "*.*"), FD);
 if H <> INVALID_HANDLE_VALUE then
   try
     repeat
       if FD.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
       begin
         if DeleteFile(Dir + FD.cFileName) then
           Inc(Result)
       end
       else
       begin
         if (StrComp(FD.cFileName, ".") <> 0) and (StrComp(FD.cFileName, "..") <> 0) then
           Inc(Result, DelCommand(Dir + FD.cFileName + "\"))
       end
     until not FindNextFile(H, FD)
   finally
     Windows.FindClose(H)
   end
end


Функция возвращает общее количество удалённых файлов. Путь к каталогу нужно указывать с завершающим слэшем.

Трудно выполнить полностью корректное тестирование, т.к. при работе cmd.exe выполняется много дополнительных действий -- например, работа с консолью.

Для тестирования были созданы две копии папки Temporary Internet Files на томе NTFS. Каждая из них имела размер 123 МБ и содержала 12645 файлов и 21 папку. Первая из них была очищена приведённым выше кодом -- DelCommand("E:\T1\") -- причём функция возвратила именно 12645, т.е. были удалены все файлы. После этого компьютер был перезагружен, и вторая папка очищалась командой del E:\T2 /s /q.

Результаты (Windows XP SP2) таковы:

DeleteFile -- 13 секунд
del        -- 23 секунды


Есть существенное замечание: я НЕ отключал вывод в консоль (просто потому что забыл, как это делается), поэтому в неё выводились имена каждого из удалённых файлов. Вероятно, это и есть главная причина более медленной работы del. Было бы неплохо, если бы кто-нибудь протестировал эту команду, отключив консольный вывод. У меня же на это нет ни времени, ни сил.


 
defunct ©   (2006-02-18 23:11) [33]

begin...end ©   (18.02.06 22:20) [32]
respect!

Есть существенное замечание: я НЕ отключал вывод в консоль (просто потому что забыл, как это делается), поэтому в неё выводились имена каждого из удалённых файлов. Вероятно, это и есть главная причина более медленной работы del. Было бы неплохо, если бы кто-нибудь протестировал эту команду, отключив консольный вывод. У меня же на это нет ни времени, ни сил.

для чистоты эксперимента, если не затруднит
rmdir /s


 
begin...end ©   (2006-02-19 10:04) [34]

> defunct ©   (18.02.06 23:11) [33]

rmdir /s /q -- 17 секунд.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.223 c
4-1136460435
Arazel
2006-01-05 14:27
2006.03.26
Как прочитать/записать MBR из под Win9x


15-1141624851
Ega23
2006-03-06 09:00
2006.03.26
С Днём рождения! 4 марта


1-1140544275
Volf_555
2006-02-21 20:51
2006.03.26
Как в InputBox отображать текст звёздочками?!


15-1141685330
mrAndersen
2006-03-07 01:48
2006.03.26
Благодарность


2-1141660359
Volkodav
2006-03-06 18:52
2006.03.26
Изменение фонового рисунка рабочего стола





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский