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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как получить имя принимаемого файла? 
V
    Опции темы
Dobermann
Дата 21.7.2009, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Принимаю файл через filestreem, и сохраняю его так:
Код

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
 s, sl: string;
begin
 s:= Socket.ReceiveText;
 if Reciving then
  begin
   fs.Write(s[1], length(s));
   if fs.Size=DataSize then
    begin
     fs.Free;
     Reciving:=false;
     Application.MessageBox('Файл принят');
    end;
   exit;
  end;

 if copy(s, 1, 5)='Size:' then
  begin
   sl:=copy(s, 6, Pos(#0, s)-6);
   DataSize:=StrToInt(sl);
   Delete(s, 1, Pos(#0, s));
   Reciving:=true;
   fs:=TFileStream.Create('output.dat',fmCreate);   <====
   fs.Write(s[1], length(s));
  end;
end;


НО! Ведь принимаю то я и txt, doc и rar и т.д. и каждый раз приходится менять расширение и имя у output.dat!!!

Вопрос собственно в том, как сохранять файл в потоке с его первоначальным именем и расширением??? Как это fs:=TFileStream.Create('output.dat',fmCreate); должно выглядеть???
PM   Вверх
dvamaster
Дата 21.7.2009, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 10



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

Size: 65536; Filename: filename.ext



--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Dobermann
Дата 21.7.2009, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dvamaster @  21.7.2009,  07:30 Найти цитируемый пост)
судя по всему ты не передаешь имя файла с расширением, попробуй доработать: включи имя файла в строку передачи текста с размером
например так

Это да! Но размер файла я вычисляю функцией Size(), а вот как определить имя файла? 
Может отрезать весь путь до последнего слеша в filename (opendialog)??? 
Только как это будет примерно выглядеть?
PM   Вверх
Dobermann
Дата 21.7.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мда...спасиба парни! smile 
Код

function ExtractFileNameEx(FileName: string): string;
begin
  I := Length(FileName);
  if I <> 0 then
  begin
    while (FileName[i] <> '\') and (i > 0) do
      i := i - 1;
      S := Copy(FileName, i + 1, Length(FileName) - i);
      i := Length(S);
      ExtractFileNameEx:=S;
  end;
end;

PM   Вверх
dvamaster
Дата 21.7.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 10



сборщик заголовка для передачи

Код

function MakeHeader(ASize: Integer; AFileName: String): String;
begin
  Result := 'Size:' + IntToStr(ASize) + ';Filename:' + AFileName
end;


разборщик заголовка для приема

Код

procedure ParseHeader(AHeader: String; var ASize: Integer; var AFileName: String);
var
  sp, fp: Integer;
begin
  ASize := 0;
  AFileName := '';
  sp := Pos('Size:', AHeader);
  fp := Pos(';FileName:', AHeader);
  try
    ASize := StrToInt(Copy(AHeader, sp + 5, fp - sp - 5));
  except
    Exit
  end;
  AFileName := Copy(AHeader, fp + 10, Length(AHeader) - fp - 9);
end;



--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Dobermann
Дата 21.7.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dvamaster, а как теперь принять размер, имя, и сам файл???
Код

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
 s, sl: string;
begin
 s:= Socket.ReceiveText;
 if Reciving then
  begin
   fs.Write(s[1], length(s));
   if fs.Size=DataSize then
    begin
     fs.Free;
     Reciving:=false;
     Application.MessageBox('Файл принят');
    end;
   exit;
  end;
 if copy(s, 1, 5)='Size:' then
  begin
   sl:=copy(s, 6, Pos(#0, s)-6);
   DataSize:=StrToInt(sl);
   Delete(s, 1, Pos(#0, s));
   Reciving:=true;
   fs:=TFileStream.Create('output.dat',fmCreate);   <====
   fs.Write(s[1], length(s));
  end;
end;

Что тут изменить нужно???
PM   Вверх
dvamaster
Дата 21.7.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 10



Напиши как выглядит протокол, сам я понимаю как-то так:
Код

Size:65535;Filename:filename.ext#0массив_данных_файла

так?

Добавлено через 39 секунд
между заголовком и файлом идет нулевой символ?


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Dobermann
Дата 21.7.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dvamaster @  21.7.2009,  12:10 Найти цитируемый пост)
между заголовком и файлом идет нулевой символ? 

Да, это для отделения размера файла от данных находящихся в самом файле...размер файла передается в том же потоке, просто я его от данных нулевым символом разделил...

Добавлено через 43 секунды
Код

  private
    fs: TFileStream;
    Reciving: Boolean;
    DataSize: integer;
    { Private declarations }


Добавлено через 2 минуты и 59 секунд
вот так организован поток отправки размера, нулевого символа, а затем самого файла:
Код

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
 fs: TFileStream;
begin
 if Socket.ReceiveText = 'xxx' then
  begin
   fs:=TFileStream.Create(ExtractFileNameEx(OpenDialog1.FileName), fmOpenRead);
   try
    fs.Position:= 0;
    Socket.SendText('Size:'+IntToStr(fs.Size) + #0);
    Socket.SendStream(fs);
   finally
   end;
 end;
end;

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


Опытный
**


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

Репутация: 2
Всего: 10



раньше написал функцию разбора заголовка, ее и надо применять ParseHeader

Код

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
 s, sl, fn: string;
begin
 s:= Socket.ReceiveText;
 if Reciving then
  begin
   fs.Write(s[1], length(s));
   if fs.Size=DataSize then
    begin
     fs.Free;
     Reciving:=false;
     Application.MessageBox('Файл принят');
    end;
   exit;
  end;
 sl := copy(s, 1, Pos(#0, s) - 1);
 Delete(s, 1, Pos(#0, s));
 ParseHeader(sl, DataSize, fn);   <====
 Reciving:=true;
 fs:=TFileStream.Create(fn,fmCreate);
 fs.Write(s[1], length(s));
end;


Добавлено через 1 минуту и 8 секунд
повторюсь
Код

procedure ParseHeader(AHeader: String; var ASize: Integer; var AFileName: String);
var
  sp, fp: Integer;
begin
  ASize := 0;
  AFileName := '';
  sp := Pos('Size:', AHeader);
  fp := Pos(';FileName:', AHeader);
  try
    ASize := StrToInt(Copy(AHeader, sp + 5, fp - sp - 5));
  except
    Exit
  end;
  AFileName := Copy(AHeader, fp + 10, Length(AHeader) - fp - 9);
end;



--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Dobermann
Дата 21.7.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем спасибо! Это сделал! smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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