Probleme mit zipfile unter windows 2000...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 4. März 2006, 19:12

gerold hat geschrieben:Dieser Code erzeugt identische Files beim Aufruf mit
[code=]python skriptname.py > test2.tar[/code]

Hi Jens!

Wenn man die Kommentarzeichen vor den "print"-Anweisungen, die für das CGI notwendig sind, wieder entfernt, dann funktioniert es auch mit XAMPP unter Windows 2000.

Code: Alles auswählen

print "Content-Disposition: attachment; filename=test.tar"
print "Content-Transfer-Encoding: 8bit"
print "Content-Type: application/octet-stream;\n"

# force input/output to binary
if sys.platform == "win32":
    import msvcrt
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
[...]
temp.seek(0)

Ich habe dieses Skript soeben getestet.

Hier das gesamte Skript, genau so wie ich es getestet habe. Danach habe ich die Ergebnisse mit "cmp" vom Cygwin verglichen und zum Test mit WinZip geöffnet. Allerdings habe ich nur Textdateien komprimiert. Vielleicht versuche ich es später noch mit anderen Dateien, aber erst mal mache ich Schluß.

Code: Alles auswählen

#!C:\Python24\python.exe
# -*- coding: iso-8859-1 -*-

#~ print "Content-type: text/html; charset=utf-8\n"
#~ import cgitb;cgitb.enable()

import sys, os, posixpath, time, glob
from tempfile import NamedTemporaryFile
from tarfile import TarFile

temp = NamedTemporaryFile(prefix="PyDown_")

tar = TarFile(mode="w", fileobj=temp)

for item in glob.glob("*.txt"):
    tar.add(item)

tar.close()

print "Content-Disposition: attachment; filename=test.tar"

#~ print 'Content-Transfer-Encoding: binary'

print "Content-Transfer-Encoding: 8bit"
print "Content-Type: application/octet-stream;\n"# charset=utf-8\n'



# force input/output to binary
if sys.platform == "win32":
    import msvcrt
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)



f = file("test.tar", "wb")

temp.seek(0)

while 1:
    data = temp.read(2048)
    if not data:
        break
    f.write(data)
    sys.stdout.write(data)

f.close()

temp.close()

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 6. März 2006, 14:24

Ich dummie :oops: Ich hatte wahrscheinlich das .seek(0) vergessen, deswegen klappte es nicht mit dem Test-Skript :(

Auf jeden Fall scheint es nun zu klappen!!! Dank dir, für deine Geduld.

Ich Frage mich, warum man überhaupt explizit den stdout auf binär setzten muß?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Beitragvon BlackJack » Montag 6. März 2006, 22:13

jens hat geschrieben:Ich Frage mich, warum man überhaupt explizit den stdout auf binär setzten muß?


Weil Windows sonst aus jedem '\n' ein '\r\n' macht.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 6. März 2006, 22:14

Wie nett doch Windows ist :evil:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd

Wer ist online?

Mitglieder in diesem Forum: cedsoft