Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2018, 23:32   #1
Taras2018
Пользователь
 
Аватар для Taras2018
 
Регистрация: 13.01.2018
Сообщений: 47
По умолчанию Правка. Разбитие текста (Delphi).

Этот код делит файл на части.

И вот вопрос: Есть один минус и сразу вопрос: Как сделать что бы если количество строк не кратно количеству частей то последний файл меньше ?. То есть пусть все первые файлы равны, последний меньше.

Потому что в данном случае делит не правильно.
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  //Количество частей на которые надо разбить файл.
  N = 10;
var
  F1, F2 : File;
  i, SizePart, SizePartAdd : Cardinal;
  Buff : array of Byte;
begin
  if OpenDialog1.InitialDir = '' then begin
    OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
  end;
  if not OpenDialog1.Execute then Exit;
  if not FileExists(OpenDialog1.FileName) then begin
    ShowMessage('Указанный файл не найден. Действие отменено.');
    Exit;
  end;
 
  AssignFile(F1, OpenDialog1.FileName);
  Reset(F1, 1);
 
  if FileSize(F1) < N then begin
    ShowMessage('Указанный файл слишком мал. Разбиение отменено.');
    CloseFile(F1);
    Exit;
  end;
 
  SizePart := FileSize(F1) div N;
  SizePartAdd := FileSize(F1) mod N;
 
  SetLength(Buff, SizePart);
 
  for i := 1 to N do begin
    AssignFile(F2, OpenDialog1.FileName + '.part' + IntToStr(i));
    Rewrite(F2, 1);
    BlockRead(F1, Pointer(Buff)^, SizePart);
    BlockWrite(F2, Pointer(Buff)^, SizePart);
    if (i = N) and (SizePartAdd > 0) then begin
      BlockRead(F1, Pointer(Buff)^, SizePartAdd);
      BlockWrite(F2, Pointer(Buff)^, SizePartAdd);
    end;
    CloseFile(F2);
  end;
 
  CloseFile(F1);
end;
Taras2018 вне форума Ответить с цитированием
Старый 04.02.2018, 18:20   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Фактический число считанных записей сохраняется в дополнительной переменной RecordsRead. Она будет меньше чем RecordCount, если, например, был достигнут конец файла.
отсюда
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.02.2018 в 18:24.
evg_m вне форума Ответить с цитированием
Старый 05.02.2018, 09:59   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

я бы попробовал банальное:

Код:
  SizePart := FileSize(F1) div N;

  SetLength(Buff, SizePart);

  i:=1;
  repeat
    AssignFile(F2, OpenDialog1.FileName + '.part' + IntToStr(i));
    Rewrite(F2, 1);
    BlockRead(F1, Pointer(Buff)^, SizePart, NumRead);
    BlockWrite(F2, Pointer(Buff)^, NumRead, NumWritten);
    CloseFile(F2);
    inc(i);
  until (NumRead = 0) or (NumWritten <> NumRead);

  CloseFile(F1);
p.s. и ещё раз повторю - отказывайтесь от BlockRead/BlockWrite - используйте класс TFileStream
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.02.2018, 20:09   #4
Taras2018
Пользователь
 
Аватар для Taras2018
 
Регистрация: 13.01.2018
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.s. и ещё раз повторю - отказывайтесь от BlockRead/BlockWrite - используйте класс TFileStream
Пример можете подсказать ?

Последний раз редактировалось Taras2018; 05.02.2018 в 20:11.
Taras2018 вне форума Ответить с цитированием
Старый 05.02.2018, 22:32   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Taras2018 Посмотреть сообщение
Пример можете подсказать ?
да могу, конечно.
но зачем, если в интернете полно примеров!

http://www.arvifox.com/wp-content/up...lization-6.pdf

http://decoding.dax.ru/practic/cutfile/cutfile.html

https://delphicomponent.ru/403-rabot...-v-delphi.html

http://pro.dtn.ru/delphi-net/file3.html

не разберётесь, пишите, тогда кину сюда пример.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.02.2018, 00:25   #6
Taras2018
Пользователь
 
Аватар для Taras2018
 
Регистрация: 13.01.2018
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
да могу, конечно.
но зачем, если в интернете полно примеров!
Благодарю за помощь и подсказки. Сейчас буду читать и пробовать разобраться. Если не разберусь обязательно отпишу.
Taras2018 вне форума Ответить с цитированием
Старый 06.02.2018, 00:52   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Taras2018 Посмотреть сообщение
Благодарю за помощь и подсказки. Сейчас буду читать и пробовать разобраться. Если не разберусь обязательно отпишу.
Чо за извращенец там тебя заставляет юзать старые паскальные файловые функции? Фото вредителя - в студию. Страна должна знать своих героев!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.02.2018, 17:15   #8
Taras2018
Пользователь
 
Аватар для Taras2018
 
Регистрация: 13.01.2018
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
да могу, конечно.
не разберётесь, пишите, тогда кину сюда пример.
Цитата:
Сообщение от min@y™ Посмотреть сообщение
Чо за извращенец там тебя заставляет юзать старые паскальные файловые функции? Фото вредителя - в студию. Страна должна знать своих героев!
Тогда подскажите не извращенные функции для быстрого разбития файлов больших размеров. У меня получилось только сделать построчное чтение + разбитие, но за этого и скорость не очень. На большего у меня не хватает опыта....
Taras2018 вне форума Ответить с цитированием
Старый 06.02.2018, 17:40   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Taras2018 Посмотреть сообщение
Тогда подскажите не извращенные функции для быстрого разбития файлов больших размеров. У меня получилось только сделать построчное чтение + разбитие, но за этого и скорость не очень. На большего у меня не хватает опыта....
тебе ж сказали
Цитата:
и ещё раз повторю - отказывайтесь от BlockRead/BlockWrite - используйте класс TFileStream
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 06.02.2018 в 17:53.
min@y™ вне форума Ответить с цитированием
Старый 06.02.2018, 17:48   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Taras2018 Посмотреть сообщение
На большего у меня не хватает опыта....
а почему Вы не ходили по ссылкам, которые я Вам дал?

если ходили, то объясните, чем ГОТОВАЯ программа - отсюда - http://decoding.dax.ru/practic/cutfile/cutfile.html

не устроила?

если не разобрались, то там внизу страницы есть "Пример к данной статье"
это ссылка на исходники проекта - cutfile.zip

Или Вам принципиально нужно, чтобы код написал именно я?

p.s. у меня эта программа разрезала файл размером 507164678 байт на 484 части по 1 Мб за 7 секунд. Это медленно?
Тогда уберите отображение процесса разбиения, будет в несколько раз быстрее.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбитие строки на подстроки Bizunov SQL, базы данных 3 31.05.2013 15:01
Разбитие по функциям St@ter Помощь студентам 0 23.12.2012 17:01
Правка зашифрованного текста, как быть? Peppy JavaScript, Ajax 2 20.06.2012 11:59
разбитие ФИО на 3 поля Neymexa SQL, базы данных 2 23.11.2011 11:32
Strings.DelimitedText разбитие edik Общие вопросы Delphi 7 28.12.2009 13:39