รหัส asp ที่ดีมาก ไม่แนะนำให้ใช้วิธีนี้ในการบีบอัดไฟล์ขนาดใหญ่
<%@ ภาษา=VBScript %>
<% ตัวเลือกที่ชัดเจน %>
<!--#include file=asptar.asp-->
-
Response.Buffer = จริง
การตอบสนองชัดเจน
Dim Co,อุณหภูมิ,T,x,i,fsoBrowse,theFolder,TheSubFolders,FilePath,s,PH,objTar
ร่วม=0
PH=./UpFile 'File path' บีบอัดไฟล์ทั้งหมดภายใต้ Upfile
ตั้ง objTar = Tarball ใหม่
objTar.TarFilename=LvBBS_UpdateFile.rar 'ชื่อบรรจุภัณฑ์
objTar.Path=PH
ตั้งค่า fsoBrowse=CreateObject(Scripting.FileSystemObject)
ตั้งค่าโฟลเดอร์=fsoBrowse.GetFolder(Server.Mappath(PH))
ตั้งค่า SubFolders=theFolder.SubFolders
สำหรับแต่ละ T ใน theFolder.Files
Temp= Temp & T.ชื่อ & |
โค=โค+1
ต่อไป
สำหรับแต่ละ x ในโฟลเดอร์ย่อย
สำหรับแต่ละ i ใน X.Files
Temp= อุณหภูมิ & X.ชื่อ&/&i.ชื่อ&|
โค=โค+1
ต่อไป
ต่อไป
ถ้า Co<1 แล้ว
Response.Write ขณะนี้ไม่มีไฟล์ที่สามารถอัพเดตได้ให้ดาวน์โหลด
'objTar.AddMemoryFile ขออภัย.txt ไม่ใช่ไฟล์!
อื่น
อุณหภูมิ=ซ้าย(อุณหภูมิ,เลน(อุณหภูมิ)-1)
FilePath=แยก(ชั่วคราว,|)
สำหรับ s=0 ถึง Ubound (FilePath)
objTar.AddFile Server.Mappath(PH&/&FilePath(s))
ต่อไป
ถ้า Response.IsClientConnected แล้ว
objTar.WriteTar
การตอบสนองฟลัช
สิ้นสุดถ้า
สิ้นสุดถ้า
ตั้ง ObjTar = ไม่มีเลย
ตั้งค่า fsoBrowse= ไม่มีอะไร
ตั้งค่าโฟลเดอร์ = ไม่มีเลย
ตั้งค่าโฟลเดอร์ย่อย = ไม่มีเลย
-
asptar.asp
-
' ผู้สร้าง UNIX Tarball
-
ผู้เขียน: คริส รีด
' เวอร์ชั่น: 1.0.1
-
-
' คลาสนี้ให้ความสามารถในการเก็บถาวรหลายไฟล์ไว้ด้วยกันเป็นไฟล์เดียว
' ไฟล์ที่สามารถแจกจ่ายได้ที่เรียกว่า tarball (TAR ย่อมาจาก Tape ARchive)
' ไฟล์เหล่านี้เป็นไฟล์ UNIX ทั่วไปซึ่งมีข้อมูลที่ไม่มีการบีบอัด
-
' แล้วมันมีประโยชน์อะไรล่ะ มันช่วยให้คุณรวมหลาย ๆ อย่างได้อย่างมีประสิทธิภาพ
' เป็นไฟล์เดียวสำหรับการดาวน์โหลด ไฟล์ TAR สามารถอ่านและแตกไฟล์ได้
' ด้วยเครื่องมือที่หลากหลาย รวมถึง WinZip ที่แพร่หลายมาก
-
' สคริปต์นี้สามารถรวมข้อมูลสองประเภทในแต่ละไฟล์, ข้อมูลไฟล์ที่อ่านจากดิสก์,
' และสิ่งต่าง ๆ โดยตรงจากหน่วยความจำ เช่น จากสตริง ไฟล์เก็บถาวรรองรับไฟล์ต่างๆ
' โครงสร้างไบนารี ดังนั้นคุณจึงสามารถจัดเก็บไฟล์ปฏิบัติการได้หากต้องการ หรือเพียงแค่จัดเก็บ
' ข้อความ.
-
' ชั้นเรียนนี้พัฒนาขึ้นมาเพื่อช่วยฉันทำโปรเจ็กต์บางโปรเจ็กต์และได้เติบโตขึ้นในทุกโปรเจ็กต์
' การใช้งาน ขณะนี้ฉันใช้คลาสนี้เพื่อเก็บข้อมูล XML เพื่อวัตถุประสงค์ในการเก็บถาวร
' ซึ่งทำให้ฉันดึงไฟล์ XML ที่สร้างขึ้นแบบไดนามิกได้ 100 ไฟล์ในการดาวน์โหลดครั้งเดียว
-
' มีคุณสมบัติและวิธีการจำนวนเล็กน้อย ซึ่งจะอธิบายไว้ใน
'เอกสารประกอบ.
-
คลาสทาร์บอล
Public TarFilename ' ชื่อไฟล์ tarball ที่เป็นผลลัพธ์
ID ผู้ใช้สาธารณะ ' ID ผู้ใช้ UNIX
ชื่อผู้ใช้สาธารณะ ' ชื่อผู้ใช้ UNIX
Public GroupID ' รหัสกลุ่ม UNIX
Public GroupName ' ชื่อกลุ่ม UNIX
สิทธิ์สาธารณะ ' สิทธิ์ UNIX
Public BlockSize ' ขนาดไบต์ของบล็อกสำหรับ tarball (ค่าเริ่มต้น = 512)
Public IgnorePaths ' ละเว้นเส้นทางที่ให้มาสำหรับเอาต์พุต tarball
Public BasePath ' ใส่เส้นทางฐานกับแต่ละไฟล์
เส้นทางสาธารณะ
'การจัดเก็บไฟล์ข้อมูล
objFiles ส่วนตัว TmpFileName
objMemoryFiles ส่วนตัว
'ส่วนย่อยการจัดการรายการไฟล์ สิ่งพื้นฐานมาก
AddFile ย่อยสาธารณะ (sFilename)
objFiles เพิ่ม sFilename, sFilename
จบหมวดย่อย
สาธารณะย่อย RemoveFile (sFilename)
objFiles ลบ sFilename
จบหมวดย่อย
AddMemoryFile ย่อยสาธารณะ (sFilename, sContents)
objMemoryFiles เพิ่ม sFilename, sContents
จบหมวดย่อย
สาธารณะย่อย RemoveMemoryFile (sFilename)
objMemoryFiles ลบ sFilename
จบหมวดย่อย
' ส่ง tarball ไปยังเบราว์เซอร์
WriteTar ย่อยสาธารณะ ()
หรี่ objStream, objInStream, lTemp, aFiles
ตั้งค่า objStream = Server.CreateObject(ADODB.Stream) ' สตรีมหลัก
Set objInStream = Server.CreateObject(ADODB.Stream) ' อินพุตสตรีมสำหรับข้อมูล
objStream.Type = 2
objStream.Charset = x-ansi ' ASCII แบบขยายเก่าที่ดี
objStream.เปิด
objInStream.Type = 2
objInStream.Charset = x-ansi
' ตรวจสอบไฟล์ทั้งหมดที่เก็บไว้ในดิสก์ก่อน
aFiles = objFiles.Items
สำหรับ lTemp = 0 ถึง UBound (aFiles)
objInStream.Open
objInStream.LoadFromFile aFiles (lTemp)
objInStream.ตำแหน่ง = 0
'ส่งออกไฟล์ aFiles (lTemp), objStream, objInStream
TmpFileName =แทนที่(aFiles(lTemp),Server.Mappath(Path)&/,)
ไฟล์ส่งออก TmpFileName,objStream,objInStream
objInStream.ปิด
ต่อไป
'ตอนนี้เพิ่มสิ่งต่าง ๆ จากหน่วยความจำ
aFiles = objMemoryFiles.Keys
สำหรับ lTemp = 0 ถึง UBound (aFiles)
objInStream.Open
objInStream.WriteText objMemoryFiles.Item (aFiles (lTemp))
objInStream.ตำแหน่ง = 0
ไฟล์ส่งออก aFiles(lTemp),objStream,objInStream
objInStream.ปิด
ต่อไป
objStream.WriteText สตริง (BlockSize, Chr (0))
'ย้อนกระแส
' อย่าลืมเปลี่ยนประเภทกลับเป็นไบนารี ไม่เช่นนั้นการเขียนจะถูกตัดทอน
' ผ่านอักขระศูนย์ไบต์ตัวแรก
objStream.ตำแหน่ง = 0
objStream.Type = 1
' ตั้งค่าทุกสิ่งในเบราว์เซอร์
Response.AddHeader การจัดการเนื้อหา ชื่อไฟล์= & TarFilename
Response.ContentType = แอปพลิเคชัน / x-tar
Response.BinaryWrite objStream อ่าน
'ปิดแล้วกลับบ้าน'
objStream ปิด
ตั้งค่า objStream = ไม่มีเลย
ตั้งค่า objInStream = ไม่มีเลย
จบหมวดย่อย
' สร้างส่วนหัวสำหรับแต่ละไฟล์และส่งเนื้อหาไฟล์
ไฟล์ส่งออกย่อยส่วนตัว (sFilename, objOutStream, objInStream)
หรี่ lStart, lSum, lTemp
lStart = objOutStream.Position ' บันทึกสิ่งที่เรากำลังทำอยู่
ถ้า IgnorePaths แล้ว
' เราไม่สนใจเส้นทางใดๆ ที่นำหน้าชื่อไฟล์ของเรา
lTemp = InStrRev(sFilename,/)
ถ้า lTemp <> 0 แล้ว
sFilename = ขวา (sFilename, Len (sFilename) - lTemp)
สิ้นสุดถ้า
sFilename = BasePath และ sFilename
สิ้นสุดถ้า
' สร้างส่วนหัว ทุกอย่างเป็น ASCII ในฐานแปด ยกเว้นข้อมูล
objOutStream.WriteText ซ้าย (sFilename & String (100, Chr (0)), 100)
objOutStream.WriteText 100 & ขวา (000 & ต.ค. (สิทธิ์), 3) & & Chr (0) 'โหมดไฟล์
objOutStream.WriteText ขวา (สตริง (6, ) & CStr (UserID), 6) & & Chr (0) 'uid
objOutStream.WriteText ขวา (สตริง (6, ) & CStr (GroupID), 6) & & Chr (0) 'gid
objOutStream.WriteText ขวา (สตริง (11,0) & ต.ค. (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.00 น. บน 1 มกราคม 1970 (10.00 น. จริงเหรอ?)
objOutStream.WriteText 0 & String(100,Chr(0)) 'chksum พิมพ์ flag และชื่อลิงก์ เขียนช่องว่างทั้งหมดเพื่อให้ Checksum จริงได้รับการคำนวณอย่างถูกต้อง
objOutStream.WriteText ustar & Chr (0) 'เวทย์มนตร์และเวอร์ชัน'
objOutStream.WriteText ซ้าย (ชื่อผู้ใช้และสตริง (32, Chr (0)), 32) 'uname
objOutStream.WriteText ซ้าย (ชื่อกลุ่มและสตริง (32, Chr (0)), 32) 'gname
objOutStream.WriteText 40 & สตริง (4, Chr (0)) 'devmajor, devminor
objOutStream.WriteText String(167,Chr(0)) 'คำนำหน้าและผู้นำ
objInStream.CopyTo objOutStream ' ส่งข้อมูลไปยังสตรีม
ถ้า (objInStream.Size Mod BlockSize) > 0 แล้ว
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 ขวา (สตริง (7,0) & ต.ค. (lSum), 7) & Chr (0)
' ย้ายไปที่จุดสิ้นสุดของสตรีม
objOutStream.Position = objOutStream.Size
จบหมวดย่อย
'เริ่มต้นทุกอย่าง.
Class_Initialize ส่วนตัว ()
ตั้ง objFiles = Server.CreateObject (Scripting.Dictionary)
ตั้งค่า objMemoryFiles = Server.CreateObject (Scripting.Dictionary)
ขนาดบล็อก = 512
สิทธิ์ = 438 ' UNIX 666
รหัสผู้ใช้ = 0
ชื่อผู้ใช้ = รูท
รหัสกลุ่ม = 0
ชื่อกลุ่ม = รูท
IgnorePaths = เท็จ
ฐานเส้นทาง =
TarFilename = new.tar
จบหมวดย่อย
Class_Terminate ส่วนตัวย่อย ()
ตั้งค่า objMemoryFiles = ไม่มีเลย
ตั้งค่า objFiles = ไม่มีเลย
จบหมวดย่อย
จบคลาส
-