Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Впорос с одного зарубежного форума (copy open file)


Igor_thief ©   (2005-06-26 15:26:00) 

Вопрос звучал таким образом: Functions that can copy an open file in its entirety, or stream data from a open file. С первой частью я справился таким образом:
procedure TForm1.Button1Click(Sender: TObject);
var
 fs, fsOut: TFileStream;
 Buffer: array [1..300] of byte;
 c: integer;
begin
 if OpenDialog1.Execute then
   begin
     fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
     fsOut := TFileStream.Create(OpenDialog1.FileName + '.out', fmCreate);
     try
     fs.Seek(0, soFromBeginning);
     while fs.Position <> fs.Size do
       begin
         c := fs.Read(Buffer, 300);
         fsOut.Write(Buffer, c);
         FillChar(Buffer, 300, 0);
       end;
     finally
       fs.Free;
       fsOut.Free;
     end;
   end;
end;


А что автор имел ввиду во второй части (после запятой)? Объясните пожалуйста (если можно, то с примером).


Eraser   (2005-06-26 16:30:00) [1]

оба варината решаются простым созданием TFileStream с параметром fmOpenRead.


Eraser   (2005-06-26 16:28:00) [2]

P.N.P. ©   (26.06.05 16:16) [4]

имхо здесь stream не существительное, а глагол.


P.N.P.   (2005-06-26 16:16:00) [3]

Дословно вопрос переводится как
Функции, которые могут скопировать открытый файл в своей папке или поточные данные из открытого файла
Как-то странно звучит...
Может имеется ввиду доступ к файлу, уже открытому другим приложением, которое не дает прав для чтения остальным?


uny   (2005-06-26 16:04:00) [4]

[2] Igor_thief   (26.06.05 16:02)
я могу ошибаться, но приведённый пример из модуля расчёта md5 для файлов. файлы могут быть очень большими и в память не поместятся. может этот пример как раз и читает их потоками...


Igor_thief   (2005-06-26 16:02:00) [5]

uny ©   (26.06.05 16:00) [1]
Тоже вариант, но а что по-поводу "or stream data from a open file"?


uny   (2005-06-26 16:00:00) [6]

чуть другая реализация - читает всё кроме *.swp

function File_s(N: string
var
FileHandle: THandle;
MapHandle: THandle;
ViewPointer: pointer;
begin
FileHandle := CreateFile(pChar(N), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
 nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if FileHandle <> INVALID_HANDLE_VALUE then try
 MapHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil);
 if MapHandle <> 0 then try
  ViewPointer := MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0);
  if ViewPointer <> nil then try
{тут действия с файлом через ViewPointer, GetFileSize(FileHandle, nil) его размер}
  finally
   UnmapViewOfFile(ViewPointer);
  end;
 finally
  CloseHandle(MapHandle);
 end;
finally
 CloseHandle(FileHandle);
end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо