Главная страница
    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.043 c
14-1128863271
cyborg
2005-10-09 17:07
2005.10.30
Помогите исправить графрежим в Мандрейк Линукс 9


14-1128596275
КаПиБаРа
2005-10-06 14:57
2005.10.30
"Правдозащитники"


6-1120718689
luke
2005-07-07 10:44
2005.10.30
Отправка нескольких сообщений через NMSMTP


5-1105538103
AlexG
2005-01-12 16:55
2005.10.30
Свойство компонента только для чтения...


2-1128682889
Pasha L
2005-10-07 15:01
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский