powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DataSnap после получения файла с Server'а файл на сервере остаётся открытым
24 сообщений из 24, страница 1 из 1
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
    #40124582
SergeyKNP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем

реализовал по 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
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
    #40124583
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет закрытия/удаления RetStream.
...
Рейтинг: 0 / 0
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
    #40124584
SergeyKNP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmoker,
делал так на Клиенте

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



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


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

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

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



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

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
Как мне оформить свое сообщение?
...
Рейтинг: 0 / 0
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
    #40124605
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyKNP,
После until поставь, от ты нудный.))
...
Рейтинг: 0 / 0
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
    #40124618
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
    #40124634
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge
Я бы попробовал создать метод для закрытия открытого fStream1
А я бы поискал событие типа OnAfterCall/OnAfterTramsmit и прибил бы там
...
Рейтинг: 0 / 0
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
    #40124749
SergeyKNP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
DataSnap после получения файла с Server'а файл на сервере остаётся открытым
    #40124751
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyKNP,

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

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

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

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

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

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

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

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

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


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