매우 좋은 ASP 코드입니다. 이 방법은 압축에 권장되지 않습니다. 대용량 파일의 경우 몇 개의 작은 파일을 쉽게 압축할 수 있습니다.
<%@ 언어=VBScript %>
<% 옵션 명시적 %>
<!--#포함 파일=asptar.asp-->
<%
응답.버퍼 = 참
응답.지우기
Dim Co,Temp,T,x,i,fsoBrowse,theFolder,TheSubFolders,FilePath,s,PH,objTar
공동=0
PH=./UpFile '파일 경로'는 Upfile 아래의 모든 파일을 압축합니다.
objTar = 새 타르볼로 설정
objTar.TarFilename=LvBBS_UpdateFile.rar '패키지 이름
objTar.Path=PH
fsoBrowse=CreateObject(Scripting.FileSystemObject) 설정
폴더 설정=fsoBrowse.GetFolder(Server.Mappath(PH))
theSubFolders=theFolder.SubFolders 설정
theFolder.Files의 각 T에 대해
온도= 온도 & T.이름 & |
Co=Co+1
다음
하위 폴더의 각 x에 대해
X.Files의 각 i에 대해
온도= 온도 & X.이름&/&i.이름&|
Co=Co+1
다음
다음
Co<1이면
Response.Write 현재 다운로드할 수 있는 업데이트 가능한 파일이 없습니다.
'objTar.AddMemoryFile Sorry.txt,파일이 아닙니다!
또 다른
온도=왼쪽(온도,길이(온도)-1)
FilePath=분할(임시,|)
s=0인 경우 Ubound(FilePath)로
objTar.AddFile Server.Mappath(PH&/&FilePath(s))
다음
Response.IsClientConnected인 경우
objTar.WriteTar
응답.플러시
종료 조건
종료 조건
ObjTar = 없음으로 설정
fsoBrowse= 없음으로 설정
폴더 설정 = 없음
theSubFolders = 없음 설정
%>
asptar.asp
<%
' 유닉스 타르볼 생성자
' ====================
' 저자: 크리스 리드
' 버전: 1.0.1
' ====================
'
' 이 클래스는 여러 파일을 하나의 파일로 함께 보관하는 기능을 제공합니다.
' tarball이라는 배포 가능 파일입니다(TAR은 실제로 Tape ARchive를 나타냄).
' 이는 압축되지 않은 데이터가 포함된 일반적인 UNIX 파일입니다.
'
' 그렇다면 이것이 무엇에 유용합니까? 그러면 여러 항목을 효과적으로 결합할 수 있습니다.
' 파일을 단일 파일로 변환하여 TAR 파일을 읽고 추출할 수 있습니다.
' 매우 널리 배포된 WinZip을 포함하여 다양한 도구를 사용합니다.
'
' 이 스크립트에는 각 아카이브에 두 가지 유형의 데이터, 디스크에서 읽은 파일 데이터,
' 그리고 문자열과 같이 메모리에서 직접 가져온 것들도 있습니다.
' 바이너리 구조이므로 필요한 경우 실행 파일을 저장할 수도 있고 그냥 저장할 수도 있습니다.
' 텍스트.
'
' 이 수업은 제가 몇 가지 프로젝트를 수행하는 데 도움을 주기 위해 개발되었으며,
' 구현을 위해 현재 이 클래스를 사용하여 보관 목적으로 XML 데이터를 타르볼합니다.
'를 사용하면 한 번의 다운로드로 동적으로 생성된 100개의 XML 파일을 가져올 수 있습니다.
'
' 소수의 속성과 메서드가 설명되어 있습니다.
' 동봉된 문서입니다.
'
클래스 타르볼
Public TarFilename ' 결과 tarball 파일 이름
Public UserID ' UNIX 사용자 ID
Public UserName ' UNIX 사용자 이름
Public GroupID ' UNIX 그룹 ID
Public GroupName ' UNIX 그룹 이름
공용 사용 권한 ' UNIX 사용 권한
Public BlockSize ' tarball의 블록 바이트 크기(기본값=512)
Public IgnorePaths ' tarball 출력에 대해 제공된 모든 경로를 무시합니다.
Public BasePath ' 각 파일에 기본 경로를 삽입합니다.
공개 경로
'파일정보 저장
비공개 objFiles,TmpFileName
비공개 objMemoryFiles
'파일 목록 관리 하위, 매우 기본적인 것
공개 하위 추가파일(s파일 이름)
objFiles.s파일 이름 추가,s파일 이름
서브 끝
공개 하위 제거파일(s파일 이름)
objFiles.sFilename 제거
서브 끝
공용 하위 AddMemoryFile(sFilename,sContents)
objMemoryFiles.sFilename,sContents 추가
서브 끝
공개 하위 RemoveMemoryFile(sFilename)
objMemoryFiles.sFilename 제거
서브 끝
' 브라우저에 타르볼 보내기
공개 서브 WriteTar()
희미한 objStream, objInStream, lTemp, aFiles
Set objStream = Server.CreateObject(ADODB.Stream) ' 메인 스트림
Set objInStream = Server.CreateObject(ADODB.Stream) ' 데이터의 입력 스트림
objStream.Type = 2
objStream.Charset = x-ansi ' 오래된 확장 ASCII
objStream.Open
objInStream.Type = 2
objInStream.Charset = x-ansi
' 먼저 디스크에 저장된 모든 파일을 살펴봅니다.
aFiles = objFiles.Items
lTemp = 0에서 UBound(aFiles)까지
objInStream.Open
objInStream.LoadFromFile aFiles(lTemp)
objInStream.Position = 0
'파일 내보내기 aFiles(lTemp),objStream,objInStream
TmpFileName =replace(aFiles(lTemp),Server.Mappath(경로)&/,)
내보내기파일 TmpFileName,objStream,objInStream
objInStream.Close
다음
'이제 메모리에서 내용을 추가하세요.
aFiles = objMemoryFiles.Keys
lTemp = 0에서 UBound(aFiles)까지
objInStream.Open
objInStream.WriteText objMemoryFiles.Item(aFiles(lTemp))
objInStream.Position = 0
내보내기파일 aFiles(lTemp),objStream,objInStream
objInStream.Close
다음
objStream.WriteText 문자열(BlockSize,Chr(0))
'스트림을 되감기
' 유형을 다시 바이너리로 변경해야 합니다. 그렇지 않으면 쓰기가 잘립니다.
' 첫 번째 0바이트 문자를 지나갑니다.
objStream.Position = 0
objStream.Type = 1
' 모든 브라우저 항목을 설정합니다.
Response.AddHeader Content-Disposition,filename= & TarFilename
Response.ContentType = 애플리케이션/x-tar
응답.BinaryWrite objStream.Read
' 문 닫고 집에 가세요
objStream.Close
objStream = 없음으로 설정
objInStream = 없음으로 설정
서브 끝
' 각 파일에 대한 헤더를 작성하고 파일 내용을 보냅니다.
개인 하위 내보내기 파일(sFilename,objOutStream,objInStream)
희미한 lStart, lSum, lTemp
lStart = objOutStream.Position ' 현재 진행 중인 위치를 기록합니다.
IgnorePaths가 다음인 경우
' 파일 이름 앞에 붙은 모든 경로는 무시됩니다.
lTemp = InStrRev(s파일 이름,/)
lTemp <> 0이면
sFilename = Right(sFilename,Len(sFilename) - lTemp)
종료하면
sFilename = BasePath & sFilename
종료 조건
' 헤더를 작성합니다. 데이터를 제외한 모든 항목은 8진수로 된 ASCII입니다.
objOutStream.WriteText Left(s파일 이름 & 문자열(100,Chr(0)),100)
objOutStream.WriteText 100 & Right(000 & Oct(권한),3) & & Chr(0) '파일 모드
objOutStream.WriteText Right(String(6, ) & CStr(UserID),6) & & Chr(0) 'uid
objOutStream.WriteText Right(String(6, ) & CStr(GroupID),6) & & Chr(0) 'gid
objOutStream.WriteText Right(String(11,0) & Oct(objInStream.Size),11) & Chr(0) '크기
objOutStream.WriteText Right(String(11,0) & Oct(dateDiff(s,1/1/1970 10:00,now())),11) & Chr(0) 'mtime(오전 10시 이후의 초 수) 1970년 1월 1일 (오전 10시 맞나요?)
objOutStream.WriteText 0 & String(100,Chr(0)) 'chksum, 유형 플래그 및 링크 이름, 실제 체크섬이 올바르게 계산되도록 모든 공백을 작성합니다.
objOutStream.WriteText ustar & Chr(0) '마법 및 버전
objOutStream.WriteText Left(UserName & String(32,Chr(0)),32) 'uname
objOutStream.WriteText Left(GroupName & String(32,Chr(0)),32) 'gname
objOutStream.WriteText 40 & String(4,Chr(0)) 'devmajor, devminor
objOutStream.WriteText String(167,Chr(0)) '접두사 및 리더
objInStream.CopyTo objOutStream ' 데이터를 스트림으로 보냅니다.
if (objInStream.Size Mod BlockSize) > 0 then
objOutStream.WriteText String(BlockSize - (objInStream.Size Mod BlockSize),Chr(0)) '가장 가까운 블록 바이트 경계까지 패딩
종료하면
' 헤더의 체크섬을 계산합니다.
l합계 = 0
objOutStream.Position = lStart
lTemp = 1의 경우 BlockSize
lSum = lSum + (Asc(objOutStream.ReadText(1)) 및 &HFF&)
다음
'삽입해
objOutStream.Position = lStart + 148
objOutStream.WriteText Right(문자열(7,0) & Oct(lSum),7) & Chr(0)
' 스트림의 끝으로 이동
objOutStream.Position = objOutStream.Size
서브 끝
'모든 것을 시작하라
비공개 하위 클래스_Initialize()
objFiles = Server.CreateObject(Scripting.Dictionary) 설정
objMemoryFiles = Server.CreateObject(Scripting.Dictionary) 설정
블록 크기 = 512
권한 = 438 ' UNIX 666
사용자ID = 0
사용자 이름 = 루트
그룹ID = 0
그룹명 = 루트
IgnorePaths = 거짓
기본 경로 =
Tar파일 이름 = new.tar
서브 끝
비공개 하위 클래스_Terminate()
objMemoryFiles = 없음 설정
objFiles = 없음 설정
서브 끝
수업 종료
%>