Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi

Модерирует : ShIvADeSt

ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

Olezka



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
RostY
Спасиба!!!

Всего записей: 624 | Зарегистр. 30-03-2005 | Отправлено: 10:10 22-03-2006
3anadJIo



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня такие два вопроса:
1) Как сделать копироваие текста из Webbrowser под средством drag and drop
2) Операции с файлами на жестком диске, копирование, создание папок и тд.

Всего записей: 6 | Зарегистр. 11-02-2006 | Отправлено: 00:55 23-03-2006
ArtemiyUO

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На счет 2, все просто:
CreateDirectory()
CreateDir()
CopyFile()
DeleteFile()

Всего записей: 539 | Зарегистр. 12-12-2005 | Отправлено: 07:29 23-03-2006
Dod



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемые Корифеи!
В режиме консольного протокола нужны аналоги
функций KeyPressed() и ReadKey(). И еще вопрос -  
как загнать символ в буфер клавиатуры?
Заранее благодарю за советы.

Всего записей: 51 | Зарегистр. 25-09-2002 | Отправлено: 09:42 23-03-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
3anadJIo
копирорвание файлов:
делая всегда через поток

Код:
 
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;
 


Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 10:41 23-03-2006 | Исправлено: DroN_S, 10:42 23-03-2006
Vitus_Bering



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S
1. Твоя функция копир. файлов работает быстрее, чем функция API Windows ShFileOperation?
2. Копирует ли она файл с полным путем к нему?

Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 11:14 23-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
2. Копирует ли она файл с полным путем к нему?

Не понимаю вопроса. Ведь "полный путь" по определению полный. Копирует.

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 11:30 23-03-2006
Vitus_Bering



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я имею ввиду копирование с сохранением структуры папок.

Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 11:50 23-03-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vitus_Bering
ты навеоно немного не понял из исходника, у меня идёт не копирование каталогов а только файлов...
для копирования файлов с каталогами, я делаю так

Код:
 
var
  OpStruc: TSHFileOpStruct;
  frombuf, tobuf: array [0..128] of Char;
begin
  FillChar( frombuf, Sizeof(frombuf), 0 );
  FillChar( tobuf, Sizeof(tobuf), 0 );
  StrPCopy( frombuf, 'c:\1\*.*' );
  StrPCopy( tobuf, 'c:\2' );
  with OpStruc do
  begin
    Wnd:= Handle;
    wFunc:= FO_COPY;
    pFrom:= @frombuf;
    pTo:=@tobuf;
    fFlags:= FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
    fAnyOperationsAborted:= False;
    hNameMappings:= nil;
    lpszProgressTitle:= nil;
  end;
  ShFileOperation( OpStruc );
 

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 11:56 23-03-2006
Vitus_Bering



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S
Меня интересует, есть ли другой способ копирования файлов с каталогами, не используя ShFileOperation, и который делает это быстрее.

Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 13:36 23-03-2006
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vitus_Bering
IMHO Быстрее чем шелл скопировать врядли удасться (кроме частных случаев)...

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 13:38 23-03-2006
Vitus_Bering



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ИМХО копирование файлов в Total Commander быстрее, чем с ShFileOperation, а написан ТС, как известно, на Delphi 2!

Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 13:46 23-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
procedure CopyFile(file1,file2: string);
var  
 FromF, ToF: file;  
 NumRead, NumWritten: Integer;
 Buf: array[1..2048] of Char;
begin
 begin
 AssignFile(FromF, file1);
 Reset(FromF, 1);
 AssignFile(ToF, File2);
 Rewrite(ToF, 1);
 repeat
 BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
 BlockWrite(ToF, Buf, NumRead, NumWritten);
 until (NumRead = 0) or (NumWritten <> NumRead);
 CloseFile(FromF);
 CloseFile(ToF);
 end;
 end;
 
Можно увеличить размер буфера, это позволит считывать файл большими кусками. В принципе очень быстро работает, минусы: при копировании большого файла программа будет тормозить (возможно, следует запускать процедуру в отдельном потоке).

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 13:50 23-03-2006
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vitus_Bering
Коммандер не всегда копирует быстрее.
 
Насколько я знаю, там используется подход, который указал Jokerjar

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 13:53 23-03-2006
Vitus_Bering



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S, vshersh, Jokerjar, спасибо. Получается, что оптимально использовать ShFileOperation.

Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 14:37 23-03-2006
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vitus_Bering
Если будешь копировать большие файлы в небольшом количестве, то метод Jokerjar будет самым продуктивным. А если небольшие файлы в большом количестве - то лучше шэлл.
 

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 15:47 23-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Небольшие файлы (меньше 1 мб) можно копировать даже так: немного исправляем вышенаписанную процедуру, размеру буфера присваиваем размер файла-источника (динамический массив - setlength). В итоге избавляемся от цикла.
 

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 16:21 23-03-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vitus_Bering
попробуй вот так

Код:
 
procedure FastFileCopy(const InfileName, OutFileName: string);
const
  BufSize = 3*4*4096; { 48Kbytes дает прекрасный результат }
type
  PBuffer = ^TBuffer;
  TBuffer = array [1..BufSize] of Byte;
var
  Size : integer;
  Buffer : PBuffer;
  infile, outfile : file;
  SizeDone, SizeFile: Longint;
begin
  if (InFileName <> OutFileName) then
  begin
    buffer := nil;
    AssignFile(infile, InFileName);
    System.Reset(infile, 1);
    try
      SizeFile := FileSize(infile);
      AssignFile(outfile, OutFileName);
      System.Rewrite(outfile, 1);
      try
        SizeDone := 0; New(Buffer);
        repeat
          BlockRead(infile, Buffer^, BufSize, Size);
          Inc(SizeDone, Size);
          BlockWrite(outfile,Buffer^, Size)
        until
          Size < BufSize;
        FileSetDate(TFileRec(outfile).Handle,
        FileGetDate(TFileRec(infile).Handle));
      finally
        if Buffer <> nil then
          Dispose(Buffer);
        System.close(outfile)
      end;
    finally
      System.close(infile);
    end;
  end
  else
    raise EInOutError.Create('File cannot be copied into itself');
end;
 

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 17:38 23-03-2006
Vitus_Bering



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S, спасибо за код.

Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 18:31 23-03-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vitus_Bering
да пожалуйста, лишь бы он был полезеным
а написать, мы ещё напишем

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 18:38 23-03-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi
ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru