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

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

Люди дайте совет по функции!


SniZ ©   (2004-07-27 22:00:00) 

Короче вот я надыбал в нете функцию, которая режет файл на части, допустим по 100 кил, и немного намодил,
вопрос: помогите мне сделать , дополнить к этой функции опцию вырезания нужного сегмента, и сохранять его в файл, например 5-го

function SplitFile(
FileName : TFileName; {файл}
SizeofFiles : Integer; {делим файл на сегменты по стокато байт ну например 100}
Progress,packet,way : integer {вот это надо! прогресс это типа процентов, а пакет номер сегмента, который я хочу достать, way - 1 поделить файл на сколько можно по сегментам (100 к например), а 2 - ну вырезать мне сегмент
) : Boolean; export; stdcall;
var
 i : Word;
 fs, sStream: TFileStream;
 SplitFileName: String;
begin
 Progress := 0;
 fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
 try
   if way=1 then begin
   for i := 1 to Trunc(fs.Size / SizeofFiles) + 1 do
   begin
     SplitFileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
     sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive);
     try
       if fs.Size - fs.Position < SizeofFiles then SizeofFiles := fs.Size - fs.Position;
       sStream.CopyFrom(fs, SizeofFiles);
       Progress := Round((fs.Position / fs.Size) * 100);
     finally
       sStream.Free;
     end;
   end;
   end;
   if way=2 then begin
   {Нужно реализовать}
   end;
 finally
   fs.Free;
 end;

end;


Fay   (2004-07-28 09:06:00) [1]

Не очень элегантно, но :
1) Конь дарёный 8)
2) Под большие части не затачивал. А мог бы 8)

procedure FYVM(SourceFile, TargetPath : string; PartSize : Cardinal);
var
 hr, hw, nr, nw, i : Cardinal;
 Buf : PChar;
label
 BuBuBu;
begin
 GetMem(Buf, PartSize);
 hr := CreateFile(PChar(SourceFile), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
 if hr = INVALID_HANDLE_VALUE then RaiseLastOSError;
 i := 0;
 hw := INVALID_HANDLE_VALUE;
 try
   goto BuBuBu;
   repeat
     Inc(i);
     hw := CreateFile(PChar(TargetPath + ExtractFileName(SourceFile) + Format('.%3.3d', [i])), GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0);
     if hw = INVALID_HANDLE_VALUE then RaiseLastOSError;
     WriteFile(hw, Buf^, nr, nw, nil);
     CloseHandle(hw);
     hw := INVALID_HANDLE_VALUE;
     BuBuBu :
     ReadFile(hr, Buf^, PartSize, nr, nil);
   until nr = 0;
 finally
   if hw <> INVALID_HANDLE_VALUE then CloseHandle(hw);
   CloseHandle(hr);
   FreeMem(Buf);
 end;
end;


Fay   (2004-07-28 08:44:00) [2]

Ужасно. Если освобожусь (мозгой) - покажу, как это делается (можно сделать). Потом 8)


zlo_inside   (2004-07-28 08:02:00) [3]

кусок вырезается так: начало куска SizeOfFiles*(packet-1), конец куска SizeOfFiles*packet . Код напишешь сам, нет здесь ничего сложного.


Piter   (2004-07-28 00:58:00) [4]

никто за тебя программу писать не будет. В чем вопрос? В чем сложность? Покажи, что ты сам хоть пытался разобраться.


Наверх

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