Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись списка в файл, с помощью WinAPI 
V
    Опции темы
VanHelsing
Дата 23.7.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Суть такова. Заполняется список, записывается в файл. При следующем открытии программы необходимо считать информацию из файла, записать в список и сравнить списки. Работу с файлами выполнить с помощью WinAPI.
Заполняю стуктуру:
Код

procedure TMainForm.FormCreate(Sender: TObject);
var
  i:integer;
begin
  HFile:=CreateFile('test.log',GENERIC_WRITE {and GENERIC_READ},FILE_SHARE_READ,
                      nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  {*Создаем файл TEST.TXT, получаем доступ к записи,
     другим процессам разрешается читать файл, файл создается перезаписыванием,
     назначаем стандартный дескриптор безопасности  *}
  if (GetLastError()=INVALID_HANDLE_VALUE) then
     ShowMessage('Не удалось создать файл');
  IndexList:=0;
  MyList:=TStringList.Create;
  MyListRead:=TStringList.Create;
  for I := 0 to 3 do
    begin
      mList.Lines.Add(btnCreateFile.Caption);
      mList.Lines.Add(btnFileWrite.Caption);
      MyList.Add(mList.Lines.Strings[i]);
    end;
  mList.Clear;
end;


Записываю в файл:
Код

procedure TMainForm.btnFileWriteClick(Sender: TObject);
var
  i:integer;
begin
  for i := 0 to MyList.Count - 1 do
   begin
    str:=MyList.Strings[i];
    WriteFile(HFile,str,Length(str),NumberWrite,nil);
    {запись в файл}
    inc(IndexList);
   end;
    FileClose(HFile);
end;

А вот со чтением проблема - надо знать количество записанной информации, вот не знаю как это сделать.  


--------------------
PM MAIL   Вверх
Yanis
Дата 23.7.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Ну и обратись в раздел WinAPI, а не в общие вопросы. Ты ж не первый день на форуме, а как маленький, ей богу.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Riply
Дата 23.7.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(VanHelsing @  23.7.2009,  11:38 Найти цитируемый пост)
А вот со чтением проблема - надо знать количество записанной информации, вот не знаю как это сделать


А что мешает сначала писать размер, потом данные ?
Т.е. структурами такого типа:
type
 MY_SIZED_DATA = packed record
   DataLength: ULONG;
   Data: array[0..0] of BYTE;
 end;

PM MAIL   Вверх
CodeMonkey
Дата 23.7.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89





--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
VanHelsing
Дата 23.7.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Yanis извини забыл - исправлюсь. smile 
Riply да такой вариант возможен, но получается что данную структуру надо тоже писать в файл.
CodeMonkey видимо я невнимательно читал, но ничего подходящего мне не нашел.
P.S. модераторы перенесите пожалуйста тему.



--------------------
PM MAIL   Вверх
CodeMonkey
Дата 23.7.2009, 19:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Цитата(VanHelsing @  23.7.2009,  19:46 Найти цитируемый пост)
видимо я невнимательно читал, но ничего подходящего мне не нашел

Мда.... http://www.delphikingdom.com/asp/viewitem....talogid=1206#06 - 1-к-1 ваше. Только слово "запись" выкиньте при чтении.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
VanHelsing
Дата 24.7.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



CodeMonkey спасибо большое. Через TFileStream я сделал - это не сложно.
Но хотелось бы сделать это через ReadFile. Честно очень стыдно, но я не совсем понимаю почему не могу использовать в качестве принимающего буфера переменную типа TStringList. И хотелось бы знать что я могу использовать в качестве буфера(кроме переменной типа String)?


--------------------
PM MAIL   Вверх
niteo
Дата 24.7.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 23.11.2006
Где: Брянск

Репутация: нет
Всего: 1



Цитата(VanHelsing @  24.7.2009,  10:11 Найти цитируемый пост)
 почему не могу использовать в качестве принимающего буфера переменную типа TStringList

Это класс.
Цитата(VanHelsing @  24.7.2009,  10:11 Найти цитируемый пост)
я могу использовать в качестве буфера

Все что хошь smile

Используй TPersistent

Это сообщение отредактировал(а) niteo - 24.7.2009, 11:03
--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
CodeMonkey
Дата 24.7.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Цитата(VanHelsing @  24.7.2009,  10:11 Найти цитируемый пост)
Через TFileStream я сделал - это не сложно. Но хотелось бы сделать это через ReadFile.

...если учесть, что TFileStream - это обёртка над ReadFile, то, что и говорить, задача эта сложная и неразрешимая smile 

Цитата(VanHelsing @  24.7.2009,  10:11 Найти цитируемый пост)
 Честно очень стыдно, но я не совсем понимаю почему не могу использовать в качестве принимающего буфера переменную типа TStringList.

Наверное потому, что вы не используете её в качестве источника. В файл вы пишите набор String-ов. TStringList в этом действе не участвует.
Я не знаю, вам может MyList.SaveToFile/MyList.LoadFromFile подойдёт? 


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
VanHelsing
Дата 24.7.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Все большое спасибо. Вроде бы получилось.
Заполнение записи:
Код

var
  MainForm: TMainForm;//главная форма
  HFile:THandle;//дескриптор файла
  MyList,MyListRead:TStringList;
  NumberWrite,NumberRead,sizeWrite:Cardinal;
  str:WideString;
  IndexList:integer;

procedure TMainForm.FormCreate(Sender: TObject);
var
  i:integer;
begin
  IndexList:=0;
  MyList:=TStringList.Create;
  MyListRead:=TStringList.Create;
  for I := 0 to 3 do
    begin
      mList.Lines.Add(btnCreateFile.Caption);
      mList.Lines.Add(btnFileWrite.Caption);
      //MyList.Add(IntToStr(Length(mList.Lines.Strings[i])));
      MyList.Add(mList.Lines.Strings[i]);
    end;
  mList.Clear;
end;
HFile:=CreateFile('test.log',GENERIC_WRITE {and GENERIC_READ},FILE_SHARE_READ,
                      nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);  
  if (GetLastError()=INVALID_HANDLE_VALUE) then
     ShowMessage('Не удалось создать файл')
  else
    begin
     btnFileWrite.Enabled:=true;
     btnFileRead.Enabled:=true;
    end;

Запись в файл:
Код

procedure TMainForm.btnFileWriteClick(Sender: TObject);
{Запись файла}
var
  i:integer;
  strCount:Integer;
begin
   for I := 0 to MyList.Count- 1 do
    begin
      strCount:=Length(MyList.Strings[i]);
      {Запись в файл размера строки}
      WriteFile(HFile,strCount,SizeOf(Integer),NumberWrite,nil);
      {запись в файл строки списка}
      str:=MyList.Strings[i];
      WriteFile(HFile,str,Length(MyList.Strings[i]),NumberWrite,nil);
    end;
    FileClose(HFile);
end;

Чтение из файла:
Код

procedure TMainForm.btnFileReadClick(Sender: TObject);
var
  i:integer;
  //strCount:Cardinal;
  strCount:Integer;
begin
  HFile:=CreateFile('test.log',GENERIC_READ,FILE_SHARE_READ,
                      nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);  
  if HFile=0 then
   begin
     ShowMessage('Файл не существеут');
     Exit;
   end;
   for I := 0 to MyList.Count- 1 do
    begin
       ReadFile(HFile,strCount,SizeOf(Integer),NumberRead,nil);
       ReadFile(HFile,str,strCount,NumberRead,nil);
       MyListRead.Add(str);
    end;
end;

P.S. если где не прав, то обязательно подскажите. smile 


--------------------
PM MAIL   Вверх
CodeMonkey
Дата 25.7.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Неправы. И ошень сильно.

P.S. Кстати, а какой у вас смысл писать в файл unicode-строку? Это внешнее требование?

Это сообщение отредактировал(а) CodeMonkey - 25.7.2009, 09:43


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.