myle σε ευχαριστώ πάρα πολύ!!! Τα κατάφερα! Άλλαξα τον κωδικά μου έκανα κάποιες βελτιώσεις όπως να ανοίγει τα αρχεία μόνο σε binary mode και δούλεψε. Δοκίμασα να συμπιέσω και να
αποσυμπιέσω δύο τραγούδια και τα αρχεία που δημιουργήθηκαν στην αποσυμπίεση δούλευαν κανονικά
χωρίς να με πετάει μήνυμα ο music player ότι το αρχείο είναι κατεστραμμένο(Που σημαίνει ότι τα bytes των αρχείων γράφονται σωστά χωρίς να έχει γίνει κάνα λάθος χάνοντας κάποια πληροφορία.)
Είμαι πολύ χαρούμενος επειδή κατάφερα να αναπτύξω λίγο τις ικανότητες μου στον προγραμματισμό μιας και κατάφερα να λύσω ένα αρκετά περίπλοκο πρόβλημα. Επίσης αυτόν
τον τρόπο τον σκέφτηκα εντελώς μόνος μια φορά που προσπαθούσα να κοιμηθώ
δεν τον είδα πουθενά!!!
Έχω όμως ακόμα μια μικρή αποριούλα
Όταν γράφω ένα string σε binary mode με αυτόν τον τρόπο
file.write( str.encode("This is a line \r\n") )
γιατί πρέπει να βάλω και το \r αλλά όχι μόνο το \n για να αλλάξω
γραμμή;;;;; Στην αρχή έβαζα μόνο το \n και δεν δούλευε, αλλά τελικά βρήκα αυτήν την μέθοδο
στο ιντερνετ.
Να και ο νέος μου κώδικας:
# -*- coding: utf-8 -*-
#FileName : zipper.py
#Developer: Nikolaos Bampaliaris
#Year : 2015
import os, sys
def main(argv):
#Missing option.
if len(argv) < 2:
print("You have to add an option(-zip or -unzip).\n")
sys.exit()
#Option is -zip.
elif argv[1] == "-zip":
#Syntax error.
if len(argv) < 4:
print("Sytnax Errorn\nSyntax: -zip -filename fileList\n\n")
sys.exit()
#Missing filename option.
if "-" not in argv[2]:
print("You must add the filename option. \n\n")
sys.exit()
#No syntax error.
else:
#----Taking the filenames from the input----#
filenames = []
for i in range(3, len(argv)):
filenames.append(argv[i])
#----Taking the filenames from the input----#
#Checking and taking the size of the files.
sizes = checkFiles(filenames)
#Create the zip file.
zipFiles(filenames, sizes, argv[2])
#Option is -unzip.
elif argv[1] == "-unzip":
#Syntax error.
if len(argv) < 3:
print("Syntax Error!\nSyntax: -unzip zipFile\n\n")
sys.exit()
#No syntax error.
else:
unzipFiles(argv[2])
#Uknown option.
else:
print("Uknown option: \""+argv[1]+"\".\n")
sys.exit()
def checkFiles(fileNames):
filesSize = [] #List Of Files Size.
#Looping through the fileNames.
for filename in fileNames:
#See if the file exists.
try:
file = open(filename, "rb")
filesSize.append(os.path.getsize(filename)) #Append the size of the current file.
file.close()
#The file could not been opened.
except:
print("The file: \""+filename+"\", could not been opened!\n\n")
sys.exit()
#Return the files size.
return filesSize
def getNameFromPath(path):
name = ""
listedPath = list(path)
count = 0
#----Looping through the path characters----#
for char in listedPath:
if char == "/" or char == "\\":
count += 1
#----Looping through the path characters----#
#The path is already just the file name.
if count == 0:
return path
#----Looping whil count is more than zero----#
while count > 0:
#This will break the loop eventually.
if listedPath[0] == "/" or listedPath[0] == "\\":
count -= 1
#Removing the first item from the list.
listedPath.remove(listedPath[0])
#----Looping whil count is more than zero----#
#----Looping through the path characters----#
for char in listedPath:
name += char #Creatting the name.
#----Looping through the path characters----#
#Return the name.
return name
def zipFiles(filenames, sizes, zipFileName):
#Removing the - character from the zipFileName#
zipFileName = list(zipFileName)
zipFileName.remove(zipFileName[0])
zip_File_Name = ""
for char in zipFileName:
zip_File_Name += char
#Removing the - character from the zipFileName#
zipFile = open(zip_File_Name, "wb") #Opening a file to write bytes on it.
headerSize = 0
#----------Creating the header of the file----------#
for i in range(0, len(sizes)):
headerSize += zipFile.write(str.encode( getNameFromPath(filenames[i])+"="+str(sizes[i])+"\r\n" ) )
zipFile.write(str.encode("</Header>\r\n"))
#----------Creating the header of the file----------#
#----------Writing the bytes from the files into the zip file----------#
for i in range(0, len(sizes)):
#Trying to open the current file.
try:
file = open(filenames[i], "rb")
zipFile.write(file.read())
file.close()
#Problem in opening the file.
except:
print("File: \""+filenames[i]+"\" could not been opened.\n\n")
system.exit()
#----------Writing the bytes from the files into the zip file----------#
zipFile.close()
print("The files have been zipped successfully!\n\n")
def unzipFiles(zipFileName):
filenames = []
sizes = []
zipFile = open(zipFileName, "rb") #Opening the file.
next_line = bytes.decode(zipFile.readline()) #Reading the very first line.
#----------Recovering the headers information----------#
while next_line != "</Header>\r\n":
name = ""
size = ""
listedNextLine = list(next_line) #Listing the line.
#----Recovering the filename in the current line----#
while listedNextLine[0] != "=":
name += listedNextLine[0]
listedNextLine.remove(listedNextLine[0])
#----Recovering the filename in the current line----#
#----Recovering the filesize in the current line----#
for i in range(1, len(listedNextLine)):
if listedNextLine[i] != "\r":
size += listedNextLine[i]
else:
break
#----Recovering the filesize in the current line----#
filenames.append(name) #Appending the filename of the current line.
sizes.append(int(size)) #Appending the size of the file in the current line.
next_line = bytes.decode(zipFile.readline()) #Reading the next line.
#----------Recovering the headers information----------#
#------------------Creating the files------------------#
for i in range(0, len(sizes)):
file = open(filenames[i], "wb")
while sizes[i] > 0:
file.write(zipFile.read(1))
sizes[i] -= 1
file.close()
#------------------Creating the files------------------#
zipFile.close()
print("The files have been unzipped successfully!\n\n")
#Starting the program.
if (__name__ == "__main__"):
main(sys.argv)