كود ASP جيد جدًا، لا يُنصح باستخدام هذه الطريقة للضغط، بالنسبة للملفات الكبيرة، من السهل ضغط بعض الملفات الصغيرة.
<%@ اللغة=VBScript %>
<% خيار صريح %>
<!--#include file=asptar.asp-->
<%
Response.Buffer = صحيح
الاستجابة.واضحة
Dim Co,Temp,T,x,i,fsoBrowse,theFolder,TheSubFolders,FilePath,s,PH,objTar
شارك = 0
PH=./UpFile يقوم "مسار الملف" بضغط جميع الملفات ضمن Upfile
تعيين objTar = New Tarball
objTar.TarFilename=LvBBS_UpdateFile.rar 'اسم العبوة
objTar.Path=PH
تعيين fsoBrowse=CreateObject(Scripting.FileSystemObject)
قم بتعيين theFolder=fsoBrowse.GetFolder(Server.Mappath(PH))
قم بتعيين theSubFolders=theFolder.SubFolders
لكل T في theFolder.Files
درجة الحرارة= درجة الحرارة & T.الاسم & |
كو=كو+1
التالي
لكل x في المجلدات الفرعية
لكل i في X.Files
Temp= Temp & X.Name&/&i.Name&|
كو=كو+1
التالي
التالي
إذا كان Co<1 إذن
Response.Write لا يوجد حالياً أي ملف قابل للتحديث للتنزيل.
'objTar.AddMemoryFile آسف.txt، ليس ملف!
آخر
درجة الحرارة = اليسار (درجة الحرارة، لين (درجة الحرارة) -1)
FilePath=Split(Temp,|)
لـ 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 في ملف واحد للتنزيل. ملفات TAR قابلة للقراءة والاستخراج
من خلال مجموعة واسعة من الأدوات، بما في ذلك برنامج WinZip الموزع على نطاق واسع.
'
' يمكن أن يتضمن هذا البرنامج النصي نوعين من البيانات في كل أرشيف، بيانات الملف المقروءة من القرص،
"وأيضًا الأشياء مباشرة من الذاكرة، مثل الملفات التي تدعمها الأرشيفات
"بنية ثنائية، بحيث يمكنك تخزين الملفات القابلة للتنفيذ إذا كنت بحاجة إلى ذلك، أو تخزينها فقط
' نص.
'
لقد تم تطوير هذا الفصل لمساعدتي في بعض المشاريع وقد تطور مع كل مشروع
"أستخدم حاليًا هذه الفئة لمسح بيانات XML لأغراض الأرشفة
والذي يسمح لي بالحصول على مئات من ملفات XML التي تم إنشاؤها ديناميكيًا في تنزيل واحد.
'
"هناك عدد قليل من الخصائص والأساليب، والتي تم توضيحها في
"الوثائق المصاحبة.
'
كلاس تاربال
اسم ملف TarFilename العام 'اسم ملف كرة القطران الناتج
معرف المستخدم العام معرف مستخدم UNIX
اسم المستخدم العام اسم مستخدم UNIX
معرف المجموعة العامة 'معرف مجموعة UNIX
اسم المجموعة العامة اسم مجموعة UNIX
أذونات UNIX للأذونات العامة
Public BlockSize ' حجم بايت الكتلة لكرات القطران (الافتراضي = 512)
IgnorePaths العامة ' تجاهل أي مسارات متوفرة لمخرجات كرة القطران
BasePath العام 'أدخل مسارًا أساسيًا مع كل ملف
المسار العام
'التخزين لمعلومات الملف
ملفات obj الخاصة، TmpFileName
ملفات objMemory الخاصة
'الفرعية لإدارة قائمة الملفات، أشياء أساسية جدًا
ملف AddFile الفرعي العام (اسم الملف)
objFiles.Add sFilename،sFilename
نهاية الفرعية
إزالة الملف الفرعي العام (اسم الملف)
objFiles.إزالة اسم الملف
نهاية الفرعية
AddMemoryFile العام الفرعي (sFilename،sContents)
objMemoryFiles.Add sFilename,sContents
نهاية الفرعية
إزالة الذاكرة الفرعية العامة (اسم الملف)
objMemoryFiles.إزالة اسم الملف
نهاية الفرعية
'أرسل كرة القطران إلى المتصفح
WriteTar الفرعي العام ()
Dim objStream، objInStream، lTemp، aFiles
تعيين objStream = Server.CreateObject(ADODB.Stream) ' الدفق الرئيسي
تعيين 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(Path)&/,)
تصدير الملف 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 String(BlockSize,Chr(0))
"ترجيع الدفق."
تذكر أن تقوم بتغيير النوع مرة أخرى إلى ثنائي، وإلا سيتم اقتطاع الكتابة
' بعد أول حرف صفر بايت.
objStream.Position = 0
objStream.Type = 1
'قم بتعيين كافة عناصر المتصفح
Response.AddHeader Content-Disposition,filename= & TarFilename
Response.ContentType = application/x-tar
Response.BinaryWrite objStream.Read
"أغلقه وعُد إلى المنزل."
objStream.Close
تعيين objStream = لا شيء
تعيين objInStream = لا شيء
نهاية الفرعية
' أنشئ رأسًا لكل ملف وأرسل محتويات الملف
ملف تصدير فرعي خاص (sFilename،objOutStream،objInStream)
خافت lStart، lSum، lTemp
lStart = objOutStream.Position ' سجل ما وصلنا إليه
إذا تجاهلت Paths ثم
'نحن نتجاهل أي مسارات مسبوقة بأسماء الملفات الخاصة بنا
lTemp = InStrRev(sFilename,/)
إذا كانت درجة الحرارة <> 0 إذن
sFilename = Right(sFilename,Len(sFilename) - lTemp)
نهاية إذا
sFilename = BasePath & sFilename
نهاية إذا
' قم ببناء الرأس، كل شيء هو ASCII بالنظام الثماني باستثناء البيانات
objOutStream.WriteText Left(sFilename & String(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 صباحًا على 1 يناير 1970 (الساعة 10 صباحًا، صحيح؟)
objOutStream.WriteText 0 & String(100,Chr(0)) 'chksum، اكتب العلامة واسم الرابط، واكتب جميع الفراغات حتى يتم حساب المجموع الاختباري الفعلي بشكل صحيح
objOutStream.WriteText usstar & 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 ' أرسل البيانات إلى الدفق
إذا (objInStream.Size Mod BlockSize) > 0 ثم
objOutStream.WriteText String(BlockSize - (objInStream.Size Mod BlockSize),Chr(0)) 'الحشوة إلى أقرب حد بايت كتلة
نهاية إذا
'احسب المجموع الاختباري للرأس
المجموع = 0
objOutStream.Position = lStart
بالنسبة لـ lTemp = 1 إلى BlockSize
lSum = lSum + (تصاعدي (objOutStream.ReadText(1)) و&HFF&)
التالي
"أدخله."
objOutStream.Position = lStart + 148
objOutStream.WriteText Right(String(7,0) & Oct(lSum),7) & Chr(0)
"الانتقال إلى نهاية الدفق
objOutStream.Position = objOutStream.Size
نهاية الفرعية
'ابدأ كل شيء
فئة فرعية خاصة_Initialize()
تعيين objFiles = Server.CreateObject(Scripting.Dictionary)
تعيين objMemoryFiles = Server.CreateObject(Scripting.Dictionary)
حجم الكتلة = 512
الأذونات = 438 'يونيكس 666
معرف المستخدم = 0
اسم المستخدم = root
معرف المجموعة = 0
اسم المجموعة = root
تجاهل المسارات = خطأ
المسار الأساسي =
TarFilename = new.tar
نهاية الفرعية
فئة فرعية خاصة_Terminate()
تعيين objMemoryFiles = لا شيء
تعيين objFiles = لا شيء
نهاية الفرعية
نهاية الفصل
%>