Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

Помогите разбраться с TFileStream   Найти похожие ветки 

 
SergProger ©   (2005-10-01 02:11) [0]

Всем привет. Вот есть у мня две процедуры:

procedure CreateStream(Files: TString; OutputFile: String);
var
 InFile, OutFile: TFileStream;
 b, i: Byte;
 Name: String;
begin
 If Files.Count = 0 then begin
   Button1.Enabled:=True;
   Exit;
 end;
 OutFile:=TFileStream.Create(OutputFile,fmCreate);
 b:=Files.Count;
 OutFile.Write(b,SizeOf(Files.Count));
 For i:=0 to Files.Count-1 do begin
   Name:=ExtractFileName(Files[i]);
   OutFile.Write(Name,SizeOf(Name));
   InFile:=TFileStream.Create(Files[i],fmOpenRead);
   OutFile.CopyFrom(InFile,InFile.Size);
 end;
 InFile.Free;
 OutFile.Free;
end;

procedure CopyFromStream(InputFile, OutDirectory: String);
var
 InFile, OutFile: TFileStream;
 i, f: byte;
 Name, s: String;
begin
 InFile:=TFileStream.Create(InputFile,fmOpenRead);
 InFile.Read(f,SizeOf(f));
 For i:=1 to f do begin
   InFile.Read(Name,SizeOf(Name));
   s:=OutDirectory+Name;
   OutFile:=TFileStream.Create(s,fmCreate);
   OutFile.CopyFrom(InFile,f);
 end;
 InFile.Free;
 Outfile.Free;
end;

Первая из них работает, а вторая не хочет. В чём тут дело, объясните мне, пожалуйста.


 
Плохиш ©   (2005-10-01 02:22) [1]

Вообще-то
1. перед записью Name надо писать длину строки, а не размер указателя на неё.
2. где сохраняешь размер файла?
3. перед чтением Name необходимо распределить память для строки.


 
Spaller   (2005-10-01 03:35) [2]

Ну ты знаешь Плохишь прав, вообще говоря ф-ия sizeof должна возращать размер типа, но стринг же динамический плюс ты передаешь указатель, воспользоваться лучше ф-ией length(name), но опять таки же стринг тебе тут не поможет скорее всего, воспользуйся например ShortString - строка постоянной длины. скорее всего это самая основная ошибка. плюс
For i:=1 to f do begin
  InFile.Read(Name,SizeOf(Name));
  s:=OutDirectory+Name;
  OutFile:=TFileStream.Create(s,fmCreate);
  OutFile.CopyFrom(InFile,f);

в данном цикле я не могу понять чего ты хочешь сделать, на первый взгляд может показаться что в потоке InFile находится f одинаковых структур данных и ты их считываешь последовательно, тогда зачем каждый раз вызываешь    OutFile:=TFileStream.Create(s,fmCreate);, засоряя тем самым память, выделяя новую память, то есть ты f раз делаешь одно  и тоже, так что объясни что ты хотел сделать, хотя может просто я не понял :) Хатя сейчас присмотрелся и понял что OutFile ведь сразу же после цикла уничтожается, тогда зачем было считывать, если просто надо было перевести указатель на нужную позицую путем считывания можно было считать f*f байт...ну кароче не понимаю я смысла данной процедуры так что наверное чуши тут понаписал....InFile.Read(f,SizeOf(f)); - зачем писать sizeof? так конечно нагляднее но медленне :) это я так к слову... может много платформенная программа, хотя байт он и есть байт и не меняется в отличии от слов... ладно все...


 
SergProger ©   (2005-10-06 15:05) [3]

Большое спасибо за совет. Но вот доработал код, но всё равно программа не читает строки как надо. Вот конечный код:

procedure FilesInOne(ExpFileName, Dir: String; Files: TStrings);
var
 InFile, OutFile: TFileStream;
 Size: Int64;
 f, i, l: Word;
 s: String;
begin
 OutFile:=TFileStream.Create(ExpFileName,fmCreate);
 f:=Files.Count;
 OutFile.Write(f,SizeOf(f));
 For i:=0 to f-1 do begin
   s:=Files[i];
   l:=Length(s);
   OutFile.Write(l,SizeOf(l));
   OutFile.Write(s[l],l);
 end;
 For i:=0 to f-1 do begin
   s:=Files[i];
   InFile:=TFileStream.Create(Dir+s,fmOpenRead);
   Size:=InFile.Size;
   OutFile.Write(Size,SizeOf(Size));
   OutFile.CopyFrom(InFile,Size);
   InFile.Free;
 end;
 OutFile.Free;
end;

procedure OneInFiles(ImpFileName, Dir: String);
var
 InFile, OutFile: TFileStream;
 Files: TStringList;
 Size: Int64;
 f, i, l: Word;
 s: String;
begin
 InFile:=TFileStream.Create(ImpFileName,fmOpenRead);
 InFile.Read(f,SizeOf(f));
 Files:=TStringList.Create;
 For i:=1 to f do begin
   InFile.Read(l,SizeOf(l));
   SetLength(s,l);
   InFile.Read(s[l],l);
   Files.Add(s);
 end;
 For i:=0 to f-1 do begin
   InFile.Read(Size,SizeOf(Size));
   ForceDirectories(ExtractFileDir(Dir+Files[i]));
   OutFile:=TFileStream.Create(Dir+Files[i],fmCreate);
   OutFile.CopyFrom(InFile,Size);
   OutFile.Free;
 end;
 Files.Free;
 InFile.Free;
end;

  НУ ЧТО ОН ТЕПЕРЬ ОТ МЕНЯ ХОЧЕТ ???


 
umbra ©   (2005-10-06 15:15) [4]


> НУ ЧТО ОН ТЕПЕРЬ ОТ МЕНЯ ХОЧЕТ ???


ОН обычно говорит, что не так. Что не получается конкретно?


 
MBo ©   (2005-10-06 15:17) [5]

OutFile.Write(s[l],l);
что за индекс в квадратных скобках?


 
icWasya ©   (2005-10-06 17:51) [6]

и в догонку
var
i,f:word; // здесь описываются беззнаковые переменные
f:=Files.Count; // а если Count = 0
For i:=0 to f-1 do // то как будет работать этот оператор я не знаю


 
SergProger ©   (2005-10-06 21:29) [7]

Дело в том, что записанные имена файлов потом читаются некорректно: если например записана одна строка, то прочитает он её идеально, а если больше, то полная абракадабра.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.137 c
2-1128645090
beglec
2005-10-07 04:31
2005.10.30
Как запустить приложение без формы?


3-1126793407
erika
2005-09-15 18:10
2005.10.30
генератор через IBquery


14-1129105703
Slider007
2005-10-12 12:28
2005.10.30
Проблема с ICQ траффиком


1-1129025202
Alex_Mel
2005-10-11 14:06
2005.10.30
Как корректно создать несколько экземпляров формы...


14-1128623461
Michael5
2005-10-06 22:31
2005.10.30
Поделитесь, кто чего интересного за последнее время (а может,





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский