Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DataSnap после получения файла с Server'а файл на сервере остаётся открытым / 24 сообщений из 24, страница 1 из 1
03.01.2022, 19:19
    #40124582
SergeyKNP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Привет всем

реализовал по DataSnap получение файла с Servera используя пример из Инета

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
//Server сторона:
function TServerMethods1.DownloadFile(out Size: Int64): TStream;
begin
    Result := TFileStream.Create('upload.fil', fmOpenRead or fmShareDenyNone);
    Size := Result.Size;

    Result.Position := 0;
end;

//Client сторона:
procedure TfMain.DownloadFile(Sender: TObject);
var
    RetStream: TStream;
    Buffer: PByte;
    Mem: TMemoryStream;
    BytesRead: Integer;
    DocumentId: Int64;
    Size: Int64;
    filename: WideString;
    BufSize: Integer;
begin
    BufSize := 1024;

    try
      Mem := TMemoryStream.Create;
      GetMem( Buffer, BufSize );

      try
        RetStream := FDownloadDS.DownloadFile(Size);
        RetStream.Position := 0;

        if ( Size <> 0 ) then
        begin
          filename := 'download.fil';

          repeat
            BytesRead := RetStream.Read( Pointer( Buffer )^, BufSize );

            if ( BytesRead > 0 ) then
            begin
              Mem.WriteBuffer( Pointer( Buffer )^, BytesRead );
            end;

            lStatus.Caption := IntToStr( Mem.Size ) + '/' + IntToStr( Size );
            Application.ProcessMessages;

          until ( BytesRead < BufSize );

          if ( Size <> Mem.Size ) then
          begin
            raise Exception.Create( 'Error downloading file...' );
          end;
 
        Mem.SaveToFile('c:\Test.pdf');
        end
        else
        begin
          lStatus.Caption := '';
        end;
      finally
        FreeMem( Buffer, BufSize );
        FreeAndNIl(Mem);
      end;
    except
      on E: Exception do
      begin
        lErrorMessage.Caption := PChar( E.ClassName + ': ' + E.Message );
      end;
    end;
end;



но файл на сервере остаётся открытым, даже если клиентское приложение закрыть
его ни удалить, ни изменить

Может кто знает где поправить?
...
Рейтинг: 0 / 0
03.01.2022, 19:40
    #40124583
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Нет закрытия/удаления RetStream.
...
Рейтинг: 0 / 0
03.01.2022, 19:48
    #40124584
SergeyKNP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
GunSmoker,
делал так на Клиенте

Код: pascal
1.
2.
3.
4.
5.
6.
...
finally
   FreeMem( Buffer, BufSize );
   FreeAndNIl(Mem);
   FreeAndNil(RetStream);
end;



не помогло
я даже приложение Клиента закрываю, а на сервере файл открытым остаётся
Windows 11
Delphi 11
и Сервер и Клиент 64х разрядные
...
Рейтинг: 0 / 0
03.01.2022, 20:36
    #40124586
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
SergeyKNP,
Не полагайся на Free, сделай объекту-читателю явный Close сразу же после Read.
...
Рейтинг: 0 / 0
03.01.2022, 21:05
    #40124587
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Создаваемый TServerMethods1.DownloadFile TStream не удаляется.
...
Рейтинг: 0 / 0
03.01.2022, 21:06
    #40124588
SergeyKNP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Vlad F,

извини за тупость, но где и как это сделать не соображу...
на сервере: как закрыть Result? :(

Код: pascal
1.
2.
3.
4.
5.
6.
function TServerMethods1.DownloadFile(out Size: Int64): TStream;
begin
    Result := TFileStream.Create('upload.fil', fmOpenRead or fmShareDenyNone);
    Size := Result.Size;
    Result.Position := 0;
end;



на клиенте: не у Mem, не у RetStream нет Close;
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
procedure TfMain.DownloadFile(Sender: TObject);
var
    RetStream: TStream;
    Buffer: PByte;
    Mem: TMemoryStream;
    BytesRead: Integer;
    DocumentId: Int64;
    Size: Int64;
    filename: WideString;
    BufSize: Integer;
begin
    BufSize := 1024;

    try
      Mem := TMemoryStream.Create;
      GetMem( Buffer, BufSize );

      try
        RetStream := FDownloadDS.DownloadFile(Size);
        RetStream.Position := 0;

        if ( Size <> 0 ) then
        begin
          filename := 'download.fil';

          repeat
            BytesRead := RetStream.Read( Pointer( Buffer )^, BufSize );

            if ( BytesRead > 0 ) then
            begin
              Mem.WriteBuffer( Pointer( Buffer )^, BytesRead );
            end;

            lStatus.Caption := IntToStr( Mem.Size ) + '/' + IntToStr( Size );
            Application.ProcessMessages;

          until ( BytesRead < BufSize );

          if ( Size <> Mem.Size ) then
          begin
            raise Exception.Create( 'Error downloading file...' );
          end;
        end
        else
        begin
          lStatus.Caption := '';
        end;
      finally
        FreeMem( Buffer, BufSize );
        FreeAndNIl(Mem);
      end;
    except
      on E: Exception do
      begin
        lErrorMessage.Caption := PChar( E.ClassName + ': ' + E.Message );
      end;
    end;
end;

...
Рейтинг: 0 / 0
03.01.2022, 21:14
    #40124590
SergeyKNP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
GunSmoker,

переделал так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function TServerMethods2.GetFileFromServer(out Size: int64; f_name, Puth_file_tek, user_n, user_c: string): TStream;
var
  fStream1: TFileStream;
begin
  fStream1 := TFileStream.Create(Puth_file_tek + '\' + f_name, fmOpenRead or fmShareDenyNone);
  try
    Size := fStream1.Size;
    fStream1.Position := 0;
    Result := fStream1;
  finally
    FreeAndNil(fStream1);

  end;
end;


вообще перестал получать файл
...
Рейтинг: 0 / 0
03.01.2022, 21:52
    #40124594
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Нафига вам этот датаснап...
...
Рейтинг: 0 / 0
03.01.2022, 22:04
    #40124595
SergeyKNP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
ъъъъъ,

твои предложения.
...
Рейтинг: 0 / 0
03.01.2022, 22:10
    #40124596
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
SergeyKNP,
Не так, - поставь RetStream.Free сразу после RetStream.Read().
...
Рейтинг: 0 / 0
03.01.2022, 22:16
    #40124597
SergeyKNP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Vlad F,

Код: pascal
1.
2.
3.
repeat
BytesRead := RetStream.Read( Pointer( Buffer )^, BufSize );
RetStream.Free; !!!!!!!!!!!



как я поставлю RetStream.Free? там же repeat

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
Как мне оформить свое сообщение?
...
Рейтинг: 0 / 0
03.01.2022, 23:09
    #40124605
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
SergeyKNP,
После until поставь, от ты нудный.))
...
Рейтинг: 0 / 0
04.01.2022, 09:09
    #40124618
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
SergeyKNP
GunSmoker,

переделал так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function TServerMethods2.GetFileFromServer(out Size: int64; f_name, Puth_file_tek, user_n, user_c: string): TStream;
var
  fStream1: TFileStream;
begin
  fStream1 := TFileStream.Create(Puth_file_tek + '\' + f_name, fmOpenRead or fmShareDenyNone);
  try
    Size := fStream1.Size;
    fStream1.Position := 0;
    Result := fStream1;
  finally
    FreeAndNil(fStream1);

  end;
end;



вообще перестал получать файл

Я бы попробовал создать метод для закрытия открытого fStream1 (объявить его конечно не внутри локального метода, а как минимум внутри TServerMethodsX). И вызвал бы метод закрытия потока после чтения из клиента. Т.е. если грубо:
Код: pascal
1.
2.
3.
4.
5.
6.
function TServerMethods2.CloseUploadFileOnServer;
//var
//   fStream1: TFileStream;  - это объявить внутри TServerMethods2
begin
    FreeAndNil(fStream1);
end;

Ну и не забыть вызвать этот метод из клиента после чтения.
...
Рейтинг: 0 / 0
04.01.2022, 12:21
    #40124634
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Belotsky Serge
Я бы попробовал создать метод для закрытия открытого fStream1
А я бы поискал событие типа OnAfterCall/OnAfterTramsmit и прибил бы там
...
Рейтинг: 0 / 0
05.01.2022, 12:03
    #40124749
SergeyKNP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
_Vasilisk_,

переделал по другому, теперь вроде всё ок

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function TServerMethods2.GetFileFromServer2(out Size: int64): TStream;
var
  gFilemm: TStream;
begin
  gFilemm := TFileStream.Create('c:\Test.xlsx', fmOpenRead or fmShareDenyNone);
  try
    Result := TMemoryStream.Create;
    Result.CopyFrom(gFilemm, 0);
    Size := Result.Size;
    Result.Position := 0;
  finally
    FreeAndNil(gFilemm);
  end;
end;
...
Рейтинг: 0 / 0
05.01.2022, 12:24
    #40124751
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
SergeyKNP,

Забористый код. Зачем возвращать отдельно Size, когда он и так идёт в составе Result?
...
Рейтинг: 0 / 0
05.01.2022, 14:11
    #40124770
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
SergeyKNP
теперь вроде всё ок
Не верю. Принципиально ничего не изменилось. Да, теперь вместо блокировки файла вы начинаете бешено поглощать память. Ну если это ок, то даже не знаю что сказать
...
Рейтинг: 0 / 0
05.01.2022, 14:19
    #40124775
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
_Vasilisk_Ну если это ок, то даже не знаю что сказать

Как писал один "специалист по хай-лоад" на хабре: "чтобы отдать мегабайтный файл
миллиону пользователей нужно ОЗУ в террабайт".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.01.2022, 14:20
    #40124776
SergeyKNP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
_Vasilisk_,

предложи свой, конкретный вариант кода
...
Рейтинг: 0 / 0
05.01.2022, 14:36
    #40124781
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
_Vasilisk_
SergeyKNP
теперь вроде всё ок
Не верю. Принципиально ничего не изменилось. Да, теперь вместо блокировки файла вы начинаете бешено поглощать память. Ну если это ок, то даже не знаю что сказать

Я не особо знаток в DataSnap, но вроде он там TStream маршалирует в TDBXStreamReaderStream . Т.е. возвращаемый объект он удаляет, но, видимо, нет гарантии, что это происходит сразу.

Но, конечно, тут надо матчасть поизучать, чем такие эксперименты ставить.
...
Рейтинг: 0 / 0
05.01.2022, 14:40
    #40124785
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Проще выкинуть DataSnap и отдавать файл по SMB или HTTP.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.01.2022, 14:48
    #40124787
SergeyKNP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Dimitry Sibiryakov,

"Особо одарённых" прошу не возбуждаться и идти лесом.
...
Рейтинг: 0 / 0
05.01.2022, 16:14
    #40124814
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Dimitry Sibiryakov

Проще выкинуть DataSnap и отдавать файл по SMB или HTTP.
По SMB это как, через сетевой путь? Что-то типа:
Код: pascal
1.
       MoveResult := CopyFile(PChar(SrcFileName),PChar(DstFileName),false);

где SrcFileName - имя файла по сети, что-то типа: '//remote_host/D:/folder/filename'?
...
Рейтинг: 0 / 0
05.01.2022, 16:20
    #40124821
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
Belotsky SergeПо SMB это как, через сетевой путь?

Да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DataSnap после получения файла с Server'а файл на сервере остаётся открытым / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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