Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > копирование файла


Автор: heskey 25.8.2005, 14:25
Нужно произвести корректное копирование, то есть по байтно. smile: Если файлы полностью идэнтичны и совпали, то можно копировать..а если хоть один символ отличается, то нет! Для примера файл текстовый.
стандартная апи-функция CopyFile заменяет файл, затирая все предыдущее. Жду помощи. Спасибо.

Автор: _hunter 25.8.2005, 14:38
открываеш два TFileStream' a; сравниваеш их размеры -- если совпали -- идеш дальше; в цикле сверяеш каждый байт, если один не совпал -- выход...

Автор: heskey 25.8.2005, 14:41
это методом потока? я видел пример.

Код

Procedure FileCopy(Const SourceFileName, TargetFileName: String); 
Var 
  S,T   : TFileStream; 
Begin 
 S := TFileStream.Create(sourcefilename, fmOpenRead ); 
 try 
  T := TFileStream.Create(targetfilename, fmOpenWrite or fmCreate); 
  try 
    T.CopyFrom(S, S.Size ) ; 
    FileSetDate(T.Handle, FileGetDate(S.Handle)); 
  finally 
   T.Free; 
  end; 
 finally 
  S.Free; 
 end; 
end;


а какой функцией произвести сравнение?

Автор: _hunter 25.8.2005, 14:46
пример -- не в тему, а сравнить простым =
т.е. читаеш из одного потока один символ, из другого один и сравнивай

Автор: heskey 25.8.2005, 14:53
да..все, я понял! Read до конца файла..и сравнение.Спасибо большое. А почему именно Стримом? Ведь можно обычными средствами тогда..как на Паскале еще smile

Автор: Snowy 25.8.2005, 15:17
Потому что так быстрее и корректней.

Автор: heskey 25.8.2005, 16:14
У меня 10 кб файл минут 5 сравнивается. Хотя должно быть за секунду smile

Автор: _hunter 25.8.2005, 17:01
кто тебе сказал? smile неоптимизированное чтение по байту... хотя 5мит тоже многовато...

Автор: Poseidon 25.8.2005, 23:47
Цитата(heskey @ 25.8.2005, 14:25)
Если файлы полностью идэнтичны и совпали, то можно копировать..а если хоть один символ отличается, то нет!
http://vingrad.ru/DELPHI-DLP-001012

Автор: Romikgy 26.8.2005, 09:52
Лучше читать по 512 байт , а потом сравнивать в памяти smile

Автор: Snowy 26.8.2005, 10:07
Тогда уж сразу целиком в память глотать smile
Д а какая разница. В XP все равно упреждающее чтение на стримы работает.
Говоришь "читать байт", а у тебя уже полфайла закэшировано.

Автор: Poseidon 26.8.2005, 17:55
Цитата(Romikgy @ 26.8.2005, 09:52)
Лучше читать по 512 байт , а потом сравнивать в памяти
А это уже смотря с какой стороны посмотреть. Если предпологается, что одинаковых файлов много, то тогда лучше выбрать больший размер буфера. Если же эдентичных файлов будет мало, то буфер лучше уменшить. Почему? Все просто. Читаем допустим 16 байт, сравниваем и оп-па. Не одинаковые. Все, разница найдена. А так бы пришлось искать эту разницу читая 512 байт. А когда файлов тысячи? Время-деньги так сказать. Да и ресурсы занимаются. Так что как лучше решать кодеру, а не нам, исходя из того, где, кем, как и т.п. будет применятся его программа.

Автор: Romikgy 30.8.2005, 10:06
Цитата(Poseidon @ 26.8.2005, 17:55)
А это уже смотря с какой стороны посмотреть. Если предпологается, что одинаковых файлов много, то тогда лучше выбрать больший размер буфера. Если же эдентичных файлов будет мало, то буфер лучше уменшить. Почему? Все просто. Читаем допустим 16 байт, сравниваем и оп-па. Не одинаковые. Все, разница найдена. А так бы пришлось искать эту разницу читая 512 байт. А когда файлов тысячи? Время-деньги так сказать. Да и ресурсы занимаются. Так что как лучше решать кодеру, а не нам, исходя из того, где, кем, как и т.п. будет применятся его программа.

Смысл здеся в другом, при обращении к винту, считывается один или более секторов, а сектор и есть (как правило) 512 байт smile
То бишь даже при чтении 16 байт , считывается сектор = 512 smile
Плюс есть еще и кеширование, но про него не знаю сколько он кидает в память smile не было придлога с ним сталкнится.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)