Ich arbeite an einer Dateifreigabe client-server
, um einen bestimmten Ordner zu aktualisieren. Wenn der Client eine Verbindung mit dem Server unter Verwendung von tcp-socket
herstellt und eine bestimmte zip-file
empfängt, entpacken Sie es. Ich habe das bisher geschafft, aber ich möchte die Dateien in beiden Ordnern (Client und Server) vergleichen, um Unterschiede in den Dateien zu finden (zB: aktualisierte Dateien) und die Dateien nur herunterladen, wenn die Inhalte unterschiedlich sind.Vergleichen von Dateien zwischen Client und Server mit TCP-Socket
Mein Code:
Auftraggeber:
import socket
import zipfile
import os
def main():
host = '192.168.1.8'
port = 5000
s = socket.socket()
s.connect((host, port))
with open('C:\\file.zip', 'wb') as f:
while True:
data = s.recv(1024)
if not data:
break
f.write(data)
zip_ref = zipfile.ZipFile('C:\\file.zip', 'r')
zip_ref.extractall('C:\\')
zip_ref.close()
os.remove('C:\\file.zip')
s.close()
if __name__ == '__main__':
main()
Server:
import socket
from threading import Thread
def send_file(conn, filename):
with open(filename, 'rb') as f:
print 'Sending file'
data = f.read(1024)
while data:
conn.send(data)
data = f.read(1024)
print 'Finished sending'
conn.close()
def main():
host = '192.168.1.8'
port = 5000
s = socket.socket()
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
t = Thread(target=send_file, args=(c, 'C:\\file.zip'))
t.start()
if __name__ == '__main__':
main()
Was ich bisher versucht:
Ich versuchte filecmp.dircmp
, aber es prüft nur auf verschiedene Dateien und nicht auf unterschiedliche Inhalte von Dateien und ich konnte auch nicht den Ordner vom Client mit dem Ordner vom Server vergleichen. Ich habe auch versucht, loop
durch Dateien und filecmp
für jede Datei, aber ich konnte es auch nicht mit der gleichen Datei vom Server vergleichen.
Gibt es eine effiziente Möglichkeit, dies zu tun?
Danke! Nach einigen Tests habe ich es schließlich mit "os.path.getmtime (filename)" wie vorgeschlagen funktioniert. Meine einzige Sorge ist, dass ich gerade das "Änderungsdatum" von Server zu Client sende und es als "socket.recv (1024)" empfange, wird das für alle Szenarien in Ordnung sein? empfangen (1024)? –
'getmtime' gibt einen Gleitkomma zurück, wie in dieser anderen Antwort, ein Float in Python ist 64 Bit: https://stackoverflow.com/questions/8216088/how-to-check-the-size-of-a-float- In-Python, aber dies ist ein Zeitstempel, daher werden die vernünftigen Werte, die Sie erhalten, viel kleiner sein. –