Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr
  • 0

Datasnap으로 파일 전송 프로그램 짜고 있는데 stream 때문에 오류가 생기는 것 같네요....


김홍철

질문

Datasnap을 이용해서 파일 전송 프로그램을 짜고 있습니다.

Server 쪽 모듈은 다음과 같습니다.

// server에 있는 파일 목록 가져오는 함수....

function TDsFileTrans.GetFileList(RelativeDir: string): TStream;
var
    List : TSimpleFileInfos;
    SearchDir  : string;
    Size : Integer;
    i : Integer;
begin
    SearchDir := g_DefaultDir + RelativeDir;
    GetFileInFoList(SearchDir, '*.*', List);

    Result := TMemoryStream.Create;
    Size := SizeOf(TSimpleFileInfo);
    for i := 0 to High(List) do
    begin
        Result.Write(List[i], size);
    end;
    Result.Seek(0, TSeekOrigin.soBeginning);

end;


    BufSize = $8000;
var
    NewFileName: string;
    Mem: TMemoryStream;
    Buffer: PByte;
    BytesRead: Integer;
    TotalRead : Int64;
begin
    try
        NewFileName := g_DefaultDir + AFileName;
        NewFileName := GetReplaceDuplicatedFileName(NewFileName);
        Mem := TMemoryStream.Create;
        GetMem(Buffer, BufSize);
        try
            repeat
                BytesRead := Stream.Read(Pointer(Buffer)^, BufSize);
                if (BytesRead > 0) then
                    Mem.WriteBuffer(Pointer(Buffer)^, BytesRead);
                TotalRead := TotalRead + BytesRead;
            //until (BytesRead < BufSize);
            until (BytesRead < BufSize);
            Mem.SaveToFile(NewFileName);
            Result := Mem.Size;
        finally
            FreeMem(Buffer, BufSize);
            FreeAndNil(Mem);
        end;
    except
        Result := -1;
    end;
end;

Client쪽 모듈은 다음과 같습니다.


function TDsFileTrans.GetFileList(RelativeDir: string): TStream;
var
    List : TSimpleFileInfos;
    SearchDir  : string;
    Size : Integer;
    i : Integer;
begin
    SearchDir := g_DefaultDir + RelativeDir;
    GetFileInFoList(SearchDir, '*.*', List);

    Result := TMemoryStream.Create;
    Size := SizeOf(TSimpleFileInfo);
    for i := 0 to High(List) do
    begin
        Result.Write(List[i], size);
    end;
    Result.Seek(0, TSeekOrigin.soBeginning);

//업로드 모듈

procedure TDsFileClient.UpLoadFile1(BaseDir, FileName: string);
var
    Stream: TMemoryStream;
    ClientFile : string;
    FS          : TFileStream;
    ReadSize : Integer;
    WriteSize : Int64;
begin
    if (BaseDir[Length(BaseDir)] <> '\') then
        BaseDir := BaseDir + '\';
    ClientFile := BaseDir + FileName;
    if FileExists(ClientFile) then
    begin
        try
            Stream := TMemoryStream.Create;
            Stream.LoadFromFile(ClientFile);
            Stream.Position := 0;
            fCs.Enter;
            WriteSize := DsfileClient.UploadFile1(FileName, Stream);
            fCs.Leave;

            if (WriteSize <> Stream.Size) then
            begin
            //error
            end;
        except
            // error
        end;
        if (Assigned(Stream)) then
            FreeAndNil(Stream);
    end;
end;

처음 UploadFile1을 호출할 때는 잘 되는데 (여러번 호출해도 문제 없는 듯한데), 
파일 목록 갱신하는 모듈을 호출하고 나서 UploadFile1을 호출하면 Access violation
오류가 발생합니다. (Call Stack부분을 첨부합니다.)

또 쓰레드내에서  UploadFile1을 두 번째 호출할 때  Access vioation 오류가 발생하네요.
뭐가 문제일까요?

error_stack.png

이 댓글 링크
다른 사이트에 공유하기

0 answers to this question

Recommended Posts

이 질문에 답변한 사람이 아직 없습니다

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 질문에 답변하기...

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.