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 오류가 발생하네요.
뭐가 문제일까요?
질문
김홍철
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 오류가 발생하네요.
뭐가 문제일까요?
이 댓글 링크
다른 사이트에 공유하기
0 answers to this question
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.