Très bon code asp. Cette méthode n'est pas recommandée pour la compression. Pour les gros fichiers, il est facile de compresser quelques petits fichiers.
<%@ Langage=VBScript %>
<% Option explicite %>
<!--#include file=asptar.asp-->
<%
Réponse.Buffer = True
Réponse.Effacer
Dim Co, Temp, T, x, i, fsoBrowse, theFolder, TheSubFolders, FilePath, s, PH, objTar
Co=0
PH=./UpFile 'Chemin du fichier' compresse tous les fichiers sous Upfile
Set objTar = Nouvelle archive tar
objTar.TarFilename=LvBBS_UpdateFile.rar 'Nom de l'emballage
objTar.Path=PH
définir fsoBrowse = CreateObject (Scripting.FileSystemObject)
Définir theFolder=fsoBrowse.GetFolder(Server.Mappath(PH))
Définir theSubFolders=theFolder.SubFolders
Pour chaque T dans theFolder.Files
Temp= Temp & T.Nom & |
Co=Co+1
Suivant
Pour chaque x dans les sous-dossiers
Pour chaque i dans X.Files
Temp= Temp & X.Nom&/&i.Nom&|
Co=Co+1
Suivant
Suivant
Si Co<1 Alors
Response.Write Il n’y a actuellement aucun fichier pouvant être mis à jour à télécharger.
'objTar.AddMemoryFile Désolé.txt, pas un fichier !
Autre
Temp=Gauche(Temp,Len(Temp)-1)
Chemin de fichier=Split(Temp,|)
Pour s = 0 vers Ubound (FilePath)
objTar.AddFile Server.Mappath(PH&/&FilePath(s))
Suivant
Si Response.IsClientConnected alors
objTar.WriteTar
Réponse.Flush
Fin si
Fin si
Définir ObjTar = Rien
Définir fsoBrowse = Rien
Définir le dossier = Rien
Définir theSubFolders = Rien
%>
asptar.asp
<%
' Créateur de Tarball UNIX
' ====================
" Auteur : Chris Read
'Version : 1.0.1
' ====================
'
' Cette classe offre la possibilité d'archiver plusieurs fichiers ensemble en un seul.
' fichier distribuable appelé tarball (le TAR signifie en fait Tape ARchive).
' Il s'agit de fichiers UNIX courants contenant des données non compressées.
'
" Alors à quoi ça sert ? Eh bien, cela vous permet de combiner efficacement plusieurs
' en un seul fichier pour le téléchargement. Les fichiers TAR sont lisibles et extractibles.
' par une grande variété d'outils, dont le très largement distribué WinZip.
'
' Ce script peut inclure deux types de données dans chaque archive, des données de fichier lues à partir d'un disque,
' et aussi des choses directement à partir de la mémoire, comme à partir d'une chaîne. Les archives prennent en charge les fichiers.
' une structure binaire, vous pouvez donc stocker des fichiers exécutables si vous en avez besoin, ou simplement stocker
' texte.
'
' Ce cours a été développé pour m'aider dans quelques projets et s'est développé au fil des années.
'Actuellement, j'utilise cette classe pour tarballer des données XML à des fins d'archivage.
', ce qui me permet de récupérer des centaines de fichiers XML créés dynamiquement en un seul téléchargement.
'
' Il existe un petit nombre de propriétés et de méthodes, qui sont décrites dans le
'documentation d'accompagnement.
'
Tarball de classe
Public TarFilename ' Nom du fichier tarball résultant
ID utilisateur public ' ID utilisateur UNIX
Nom d'utilisateur public ' Nom d'utilisateur UNIX
ID de groupe public ' ID de groupe UNIX
Public GroupName ' Nom du groupe UNIX
Autorisations publiques ' Autorisations UNIX
Public BlockSize ' Taille du bloc en octets pour l'archive tar (par défaut = 512)
Public IgnorePaths ' Ignore tous les chemins fournis pour la sortie de l'archive tar
Public BasePath 'Insérer un chemin de base avec chaque fichier
Chemin public
'Stockage des informations sur les fichiers
Fichiers obj privés, TmpFileName
Fichiers objMemory privés
'Sous-marins de gestion de liste de fichiers, des trucs très basiques
Sous-fichier public AddFile(sFilename)
objFiles.Add sFilename,sFilename
Fin du sous-marin
Sous-fichier public Remove(sFilename)
objFiles. Supprimer sFilename
Fin du sous-marin
Sous-public AddMemoryFile (sFilename,sContents)
objMemoryFiles.Add sFilename,sContents
Fin du sous-marin
Sous-public RemoveMemoryFile(sFilename)
objMemoryFiles. Supprimer sFilename
Fin du sous-marin
'Envoyer l'archive tar au navigateur
Sous-public WriteTar()
Dim objStream, objInStream, lTemp, aFiles
Set objStream = Server.CreateObject(ADODB.Stream) ' Le flux principal
Set objInStream = Server.CreateObject(ADODB.Stream) ' Le flux d'entrée pour les données
objStream.Type = 2
objStream.Charset = x-ansi ' Bon vieux ASCII étendu
objStream.Open
objInStream.Type = 2
objInStream.Charset = x-ansi
' Parcourez d'abord tous les fichiers stockés sur le disque
aFiles = objFiles.Items
Pour lTemp = 0 à UBound(aFiles)
objInStream.Open
objInStream.LoadFromFile aFiles(lTemp)
objInStream.Position = 0
'ExportFile aFiles(lTemp),objStream,objInStream
TmpFileName =replace(aFiles(lTemp),Server.Mappath(Path)&/,)
ExportFile TmpFileName, objStream, objInStream
objInStream.Fermer
Suivant
'Maintenant, ajoutez des éléments de mémoire
aFiles = objMemoryFiles.Keys
Pour lTemp = 0 à UBound(aFiles)
objInStream.Open
objInStream.WriteText objMemoryFiles.Item(aFiles(lTemp))
objInStream.Position = 0
ExportFile aFiles(lTemp),objStream,objInStream
objInStream.Fermer
Suivant
objStream.WriteText Chaîne (BlockSize, Chr (0))
'Rembobiner le flux
' N'oubliez pas de redéfinir le type en binaire, sinon l'écriture sera tronquée
' après le premier caractère de zéro octet.
objStream.Position = 0
objStream.Type = 1
' Définir tous les éléments du navigateur
Response.AddHeader Content-Disposition,filename= & TarFilename
Réponse.ContentType = application/x-tar
Réponse.BinaryWrite objStream.Read
'Ferme-le et rentre chez toi
objStream.Fermer
Définir objStream = Rien
Définir objInStream = Rien
Fin du sous-marin
' Créez un en-tête pour chaque fichier et envoyez le contenu du fichier
Sous-fichier d'exportation privé (sFilename, objOutStream, objInStream)
Dim lStart, lSum, lTemp
lStart = objOutStream.Position ' Enregistre où nous en sommes
Si IgnorePaths alors
' Nous ignorons tous les chemins préfixés à nos noms de fichiers
lTemp = InStrRev(sNomFichier,/)
si lTemp <> 0 alors
sFilename = Right(sFilename,Len(sFilename) - lTemp)
finir si
sFilename = BasePath & sFilename
Fin si
' Construisez l'en-tête, tout est en ASCII en octal sauf les données
objOutStream.WriteText Left(sFilename & String(100,Chr(0)),100)
objOutStream.WriteText 100 & Right(000 & Oct(Autorisations),3) & & Chr(0) 'Mode fichier
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) 'taille
objOutStream.WriteText Right(String(11,0) & Oct(dateDiff(s,1/1/1970 10:00,now())),11) & Chr(0) 'mtime (Nombre de secondes depuis 10h du matin sur le 1er janvier 1970 (10h, n'est-ce pas ?)
objOutStream.WriteText 0 & String(100,Chr(0)) 'chksum, tapez l'indicateur et le nom du lien, écrivez tous les espaces afin que la somme de contrôle réelle soit calculée correctement
objOutStream.WriteText ustar & Chr(0) 'magie et version
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)) 'préfixe et leader
objInStream.CopyTo objOutStream ' Envoyer les données au flux
si (objInStream.Size Mod BlockSize) > 0 alors
objOutStream.WriteText String(BlockSize - (objInStream.Size Mod BlockSize),Chr(0)) 'Remplissage jusqu'à la limite d'octets du bloc la plus proche
finir si
' Calculer la somme de contrôle pour l'en-tête
lSomme = 0
objOutStream.Position = lStart
Pour lTemp = 1 à BlockSize
lSomme = lSomme + (Asc(objOutStream.ReadText(1)) Et &HFF&)
Suivant
'Insérez-le
objOutStream.Position = lDébut + 148
objOutStream.WriteText Right(String(7,0) & Oct(lSum),7) & Chr(0)
' Passer à la fin du flux
objOutStream.Position = objOutStream.Taille
Fin du sous-marin
'Commencez tout
Sous-classe privée_Initialize()
Définir objFiles = Server.CreateObject (Scripting.Dictionary)
Définir objMemoryFiles = Server.CreateObject (Scripting.Dictionary)
Taille du bloc = 512
Autorisations = 438 ' UNIX 666
ID utilisateur = 0
Nom d'utilisateur = racine
ID de groupe = 0
Nom du groupe = racine
IgnorePaths = Faux
Chemin de base =
TarFilename = nouveau.tar
Fin du sous-marin
Sous-classe privée_Terminate()
Définir objMemoryFiles = Rien
Définir objFiles = Rien
Fin du sous-marin
Fin du cours
%>