안녕하세요..
저번부터 많은 도움을 받고 있는 화랑입니다.. 단기 프로젝트가 있는 바람에..
저번 질문을 마지막으로 Upload를 잠시 접었습니다.. 이제 프로젝트가 끝이나고
다시 시작을 하고 있습니다...
저번 질문에서 주신 소스를 잘 보았습니다.
/// 저번 답변입니다.
> 제가 쓰고 있는 코드입니다. 다 보일 수는 없고... 참고하십시요...
> Pos를 사용하시면 2진 파일은 제대로 되지 않으니 CompareMem을 사용하세요...
>
> fData : OleVariant; // BinaryRead 반환 값 (모든 DATA)
> gpDataArray : PByteArray;
>
> FVarTotalBytes := gRequest.ServerVariables.Item['CONTENT_LENGTH'];
> sContentType := gRequest.ServerVariables.Item['CONTENT_TYPE'];
>
> FBoundary := GetBoundary(sContentType);
>
> // Content의 내용을 얻어 온다.
> try
> FData := gRequest.BinaryRead(fVarTotalBytes);
> gpDataArray := VarArrayLock(FData);
> fTotalBytes := VarToInt(fVarTotalBytes);
> except
> Exit;
> end;
위와 같은 내용인데요..
PbyteArray를 가지고 CompareMem을 한다고 하셨는데요..
일단전체적으로 제가 생각하고 있는 것은 일단 지금 BinaryRead 로 데이터를 받았고
그리고 Pbytearray에 저장을 했습니다.. 다음 이 데이터를 가지고
ContentType를 이용하여 분리를 해야 된다고 생각합니다.
그런데.. ContentType(String형)을 Pointer형으로 변환해서
CompareMem을 사용하여 분리를 해 내고.. 다음.. 따로 따로 저장을 해서
화일은 화일대로 다른 정보는 다른 정보대로.. 저장한다.. 이런식으로 하는것이 아닐까
생각합니다.(이것과 유사하게 ISAPI로 만들었거든요..)
질문1: 제가 원래 C를 사용하다가 델파이 한지가 얼마 되지 않았거든요.. ContentType를
Point로 변환을 해서 CompareMem을 사용을 하여 Data와 비교를 했는데.. 자꾸
동일한 binary가 없다고 나오네요.. 데이터가 Pbytearray형이니깐.. 다시 다른 형으로
변화을 해서 Comparemem을 사용해야 하나요..
질문2 만일 있을 경우 배열을 사용해서.. 따로 따로 어떻게 저장을 하죠?
String 같으면.. pos와 Copy함수를 써서 저장을 하잖아요? 델파이에서 Pointer를 가지고
어떻게 분리를 하고 저장을 하죠? Comparemem은 말대로 동일한 Binary가 있는지 체크
하잖아요.. 위치를 return해 주는 것도 아니고...
질문에 대한 답변 부탁드립니다.. 델파이의 기본땜시(형변환&Etc) 힘드네요...
> 안녕하세요..
>
> 저번부터 많은 도움을 받고 있는 화랑입니다.. 단기 프로젝트가 있는 바람에..
>
> 저번 질문을 마지막으로 Upload를 잠시 접었습니다.. 이제 프로젝트가 끝이나고
>
> 다시 시작을 하고 있습니다...
>
> 저번 질문에서 주신 소스를 잘 보았습니다.
>
> /// 저번 답변입니다.
>
> > 제가 쓰고 있는 코드입니다. 다 보일 수는 없고... 참고하십시요...
> > Pos를 사용하시면 2진 파일은 제대로 되지 않으니 CompareMem을 사용하세요...
> >
> > fData : OleVariant; // BinaryRead 반환 값 (모든 DATA)
> > gpDataArray : PByteArray;
> >
> > FVarTotalBytes := gRequest.ServerVariables.Item['CONTENT_LENGTH'];
> > sContentType := gRequest.ServerVariables.Item['CONTENT_TYPE'];
> >
> > FBoundary := GetBoundary(sContentType);
> >
> > // Content의 내용을 얻어 온다.
> > try
> > FData := gRequest.BinaryRead(fVarTotalBytes);
> > gpDataArray := VarArrayLock(FData);
> > fTotalBytes := VarToInt(fVarTotalBytes);
> > except
> > Exit;
> > end;
>
> 위와 같은 내용인데요..
> PbyteArray를 가지고 CompareMem을 한다고 하셨는데요..
>
> 일단전체적으로 제가 생각하고 있는 것은 일단 지금 BinaryRead 로 데이터를 받았고
> 그리고 Pbytearray에 저장을 했습니다.. 다음 이 데이터를 가지고
> ContentType를 이용하여 분리를 해야 된다고 생각합니다.
> 그런데.. ContentType(String형)을 Pointer형으로 변환해서
> CompareMem을 사용하여 분리를 해 내고.. 다음.. 따로 따로 저장을 해서
> 화일은 화일대로 다른 정보는 다른 정보대로.. 저장한다.. 이런식으로 하는것이 아닐까
> 생각합니다.(이것과 유사하게 ISAPI로 만들었거든요..)
요건 말이죠... 받은 모든 Data에서 따로 뭘 저장하는 게 아니라 필요한 부분의 시작과 끝위치 만을 기억하는 겁니다. (Parsing에서) 그런 후 Form Data는 Form Collection에 File Data들은 File Collection에 정보를 저장합니다. 특히 File정보는 copy하는 것이 아니라 시작과 끝 위치 정보만을 가지고 있으면 됩니다.
>
> 질문1: 제가 원래 C를 사용하다가 델파이 한지가 얼마 되지 않았거든요.. ContentType를
> Point로 변환을 해서 CompareMem을 사용을 하여 Data와 비교를 했는데.. 자꾸
> 동일한 binary가 없다고 나오네요.. 데이터가 Pbytearray형이니깐.. 다시 다른 형으로
> 변화을 해서 Comparemem을 사용해야 하나요..
Pointer 형으로 Casting 하면 됩니다.
>
> 질문2 만일 있을 경우 배열을 사용해서.. 따로 따로 어떻게 저장을 하죠?
> String 같으면.. pos와 Copy함수를 써서 저장을 하잖아요? 델파이에서 Pointer를 가지고
> 어떻게 분리를 하고 저장을 하죠? Comparemem은 말대로 동일한 Binary가 있는지 체크
> 하잖아요.. 위치를 return해 주는 것도 아니고...
>
> 질문에 대한 답변 부탁드립니다.. 델파이의 기본땜시(형변환&Etc) 힘드네요...
>
C에서도 Pointer의 Address가지고 조작할 수 있죠?
그러니 위의 시작과 끝 위치만 알면 뽑아낼 수 있겠죠...
PS 1. 위와 같이 Parsing에서의 문제점과는 달리 VB와 같이 Collection (_NewEnum)을 구현하는데에 무지 고생했습니다.
현재에는 Delphi로 만든것도 ASP나 VB에서 For Each File in Files 와 같은 코드가 먹습니다.
PS 2. File정보를 뽑아낸 후 TFileStream과 Win32API 둘다 해보세요 어떤게 더 빠른가...