![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Впорос с одного зарубежного форума (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;