Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.01.2010, 10:33
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
Вопрос Обработка больших файлов

Как узнать количество символов в файле?
Я дел так файл пихаешь в memo и потом
Код:
length(memo.lines.text)
Но при работе с файлов в 300кб, прога довольно долго думает (секунд 3-6)
Что в общем то меня и не устраивает, может есть быстрее способ? Ну или хотя бы как убрать эффект подвисания? Application.processmessages ничего не дал
  #2  
Старый 11.01.2010, 12:21
AIMor AIMor вне форума
Прохожий
 
Регистрация: 13.03.2009
Сообщения: 31
Репутация: 10
По умолчанию

Попробуй так:

Код:
Var
   F : File Of Byte;
   L : Integer;

begin
   AssignFile(F,'d:\text.txt');
   Reset(F);
   L:=SizeOf(F);
   CloseFile(F);
end;

В итоге в переменной L у тебя будет размер файла в байтах. Если помним, то один символ занимает один байт. Следовательно, получаешь количество символов.
  #3  
Старый 11.01.2010, 12:27
AIMor AIMor вне форума
Прохожий
 
Регистрация: 13.03.2009
Сообщения: 31
Репутация: 10
По умолчанию

Цитата:
Сообщение от friz
Я дел так файл пихаешь в memo

также можно попробовать пихать файл не в memo, а в переменную типа TStrings

Код:
Var
   S : TStrings;
   L : Integer;
   I : Integer;

begin
   S:=TStringList.Create;
   S.LoadFromFile('d:\text.txt');

   L:=0;
   For I:=0 To (S.Count-1) Do L:=L+Length(S.Strings[i]);

   S.Free;
end;

Это должно быть быстрее чем работа с memo
  #4  
Старый 11.01.2010, 12:56
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

Если делать через AssignFile... то у меня такой вопрос:
Как мой исходный файл f разбить на файлы длиной скажем в 2500 символом?
При работе с memo это легко делается функцией copy. Есть ли что-нить похожее у TStrings?
  #5  
Старый 11.01.2010, 13:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

TStrings и TMemo - одна фигня, т.к. TMemo.Lines - это и есть YTStrings.
Так что тебе надо? Посомтреть размер файла или именно разбить его на части? В зависимости от этого будет разный код.
  #6  
Старый 12.01.2010, 09:25
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

Да. Мне надо узнать количество символов(байт) в текстовом файле и разбить его на файлы определенного размера (например по 2000 символов)
Как это сделать в принципе знаю, но как это сделать что бы прога максимально быстро обрабатывала файлы?
  #7  
Старый 12.01.2010, 10:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

У вас 2 варианта чтения.
Можно читать сразу блоками по 2000 байт, это будет быстро, но туда попадут и символы конца строки, а это по 2 байта на строку.
Можно читать строками, но это несколько медленее, но зато там не надо обрабатывать эти символы.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
  #8  
Старый 12.01.2010, 10:29
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

Можно пример чтения по блокам?
  #9  
Старый 13.01.2010, 09:47
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

to AIMor, проверил метод с TStrings, реально работает намного быстрее, так что остановился на этот способе.
что касается SizeOf, то он у меня работает коряво и выводит фиг знает что :/
Спасибо всем за ответы! тему можно закрывать
Закрытая тема


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:03.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter