Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Прочитать файл в TByteDynArray (SOAP) / 19 сообщений из 19, страница 1 из 1
03.05.2018, 13:04
    #39639354
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Написал сервис, который должен загружать файлы.
Модуль автогенерации Delphi создал для него класс с методом:
Код: pascal
1.
function UploadDocument(const ABytes: TByteDynArray; const FileName: WideString): WideString; stdcall;


Засада там, где её не ждал - не могу прочитать файл.
Написал лабу, которая пытается скопировать файл и вообще никак не связана с SOAP.
В результате, записывается файл с какой-то ерундой.
Как можно прочитать содержимое файла в TByteDynArray ?


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm1.Button1Click(Sender: TObject);
var
 ABytes: TByteDynArray;
 Stream, Stream2:TFileStream;
begin
  Stream:=TFileStream.Create(Self.OpenDialog1.FileName,fmOpenRead);
  SetLength(ABytes,Stream.Size);
  Stream.Read(ABytes,Stream.Size);

  Stream2:=TFileStream.Create(OpenDialog1.FileName+'.new',fmCreate);
  Stream2.Write(ABytes,SizeOf(ABytes));
end;


...
Рейтинг: 0 / 0
03.05.2018, 13:19
    #39639371
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Кодируй в Base64 и передавай строкой.
...
Рейтинг: 0 / 0
03.05.2018, 13:35
    #39639386
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
rgreat,

Может это и будет так.

Но сейчас вопрос в том, как считать содержимое файла ?
...
Рейтинг: 0 / 0
03.05.2018, 13:38
    #39639388
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Valery_B,
Нужно Read применять не к переменной динамического массива, а к первому (т.е. к нулевому) элементу его.
...
Рейтинг: 0 / 0
03.05.2018, 13:48
    #39639399
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
чччД,

Ты имеешь ввиду так ?
Код: pascal
1.
Stream.Read(ABytes[0],Stream.Size);



Так я тоже попробовал, но не работает.
...
Рейтинг: 0 / 0
03.05.2018, 13:54
    #39639404
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Создаю текстовый документ, в котором пишу "Hello world!"
И не могу создать копию файла используя TByteDynArray

Получается файл аналогичной длинны, с не понятным содержанием.
...
Рейтинг: 0 / 0
03.05.2018, 13:55
    #39639406
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
вместо Stream2.Write(ABytes,SizeOf(ABytes)) тоже надо Stream2.Write(ABytes[0],SizeOf(ABytes)) делать.
...
Рейтинг: 0 / 0
03.05.2018, 13:55
    #39639407
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Valery_BТак я тоже попробовал, но не работает.Потому, что Write тоже нужно до ума довести
Код: pascal
1.
Stream2.Write(ABytes[0], Length(ABytes) * SizeOf(ABytes[0]));
...
Рейтинг: 0 / 0
03.05.2018, 13:55
    #39639408
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Мда. И не SizeOf(ABytes) а length(ABytes).

Как все запущено-то.
...
Рейтинг: 0 / 0
03.05.2018, 13:56
    #39639409
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
rgreatнадо Stream2.Write(ABytes[0], SizeOf(ABytes) ) делать.а если подумать?
...
Рейтинг: 0 / 0
03.05.2018, 13:58
    #39639411
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Сколько новых интересных вещей, и все в один день. :)
...
Рейтинг: 0 / 0
03.05.2018, 14:01
    #39639412
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
_Vasilisk_а если подумать?
Если подумать то Length(ABytes) * SizeOf(ABytes[0]) это масло-масляное.
...
Рейтинг: 0 / 0
03.05.2018, 14:11
    #39639418
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
rgreat,

УРА!
4 часа катарги прекратились!
Надо действительно считывать ABytes[0] и записывать тоже ABytes[0]
А вот передавать в SOAP уже надо именно ABytes .
Для меня - просто мистика какая та.


Что касается SizeOf и Length, во время опытов там стояло и то, и другое, и третье.
В результате я поставил Stream.Size.
...
Рейтинг: 0 / 0
03.05.2018, 14:11
    #39639419
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
_Vasilisk_,

Ты намекаешь, что на разных платформах может быть разной длина байта?
...
Рейтинг: 0 / 0
03.05.2018, 14:14
    #39639422
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Valery_BЧто касается SizeOf и Length, во время опытов там стояло и то, и другое, и третье.
В результате я поставил Stream.Size.

Если работаешь со строками - то лучше делать Length(_String_)*SizeOf(_XXX_Char_). WideChar<>AnsiChar по длине в байтах. Для UTF8 все еще веселее.
...
Рейтинг: 0 / 0
03.05.2018, 14:24
    #39639432
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
c UTF8 все просто
Код: pascal
1.
  ByteCount := TEncoding.UTF8.GetByteCount(S);
...
Рейтинг: 0 / 0
03.05.2018, 14:27
    #39639436
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Zeliusc UTF8 все просто


Но помнить об этом надо...
...
Рейтинг: 0 / 0
04.05.2018, 13:08
    #39639998
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
DarkMasterТы намекаешь, что на разных платформах может быть разной длина байта?Не. Тип переменной имеет свойство меняться. Вначале это array of Byte, потом станет array of Char.

Сам у себя везде пишу Length(array) * SizeOf(array[0]). Кушать не просит, а волнуюсь меньше
...
Рейтинг: 0 / 0
04.05.2018, 13:25
    #39640016
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать файл в TByteDynArray (SOAP)
Ты еще вместо array[0] подсунь array[low[array]] а то вдруг чего...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Прочитать файл в TByteDynArray (SOAP) / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]