pythonメニュー

指定のディレクトリ内のfilesに記憶されるファイルを送信

以下は、このページで紹介するサーバーに接続して、
指定のディレクトリ内のfilesに記憶されるファイルを送信するクライアントのコード例です。

送信用のクライアントのコード例(test_send.py)

下記、048行、049行、056〜034行を環境に合わせて変更して使います。
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import os
import socket

def send_file0(sock, filepath): # ファイル内容が全部メモリ記憶可能なサイズでのみ有効
    filesize = os.path.getsize(filepath)
    filename = os.path.basename(filepath)
    s = "f{} {}".format(filename, filesize)
    bin=(s+"\r\n").encode("utf-8")#binaryへ変換
    print(bin, end="  ")
    sock.sendall(bin) #filename filesize 送信
    with open(filepath, "rb") as f:
        bin = f.read(filesize)
    # print("送信data:" , bin )
    sock.sendall(bin) # ファイル内容一括送信
    print("送信byte:" , len(bin) )


def send_file(sock, filepath):# filepathのファイルをクライアントに送信(大きなフィルにも対応)
    try:
        filename = os.path.basename(filepath)
        file_info = os.stat(filepath)
        filesize = file_info[6]
        s = "f{} {}".format(filename, filesize)
        bin=(s+"\r\n").encode("utf-8")
        print(s) # 名前とサイズの送信文字列
        sock.sendall(bin) # send filename filesize
        CHUNK = 100000 # この数ずつ送る(必要に応じて変更)
        remaining_sizes=filesize
        with open(filepath, "rb") as f:
            while True:
                print(f"Remaining sizes:{remaining_sizes}")
                size=CHUNK if remaining_sizes >= CHUNK else remaining_sizes
                data = f.read(size)
                sock.sendall(data)
                remaining_sizes -=len(data)
                if remaining_sizes == 0: break
            #
        #
        print(f"send_file:{filepath} end." )  
    except Exception as e:
        print("send_file Error:"+ str(e))


# ----- メイン ---dirpath のディレクトリ内のfilesに記憶されるファイルを送信------------------------------
dirpath='.\\datas\\'
server_addr =("192.168.0.110", 59154) # 接続先をコードで指定する
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(server_addr)
files='''
app_pwm_esp32.umh
uBeep.umh
'''
for file in files.split("\n"):
    if file.strip() == "": continue
    filepath=dirpath+file
    send_file(sock, filepath)

sock.close()



上記の送信対象ファイル群をtest_ls.txtに列挙するコード(test_ls.py)

下記実行で、実行時のディレクトリ内にあるdirpathのフォルダの中のファイル群を、列挙(改行で)したtest_ls.txtファイル作成します。
作成したtest_ls.txtの内容を、上記のtest_send.pyの送信ファイル名群を記憶するfilesの変数初期化部分に貼り付けて使います。
#!/usr/bin/python3
# 「test_ls.py」

import os

path="./datas/"
with open( "test_ls.txt", "w") as f:
    for f_name in os.listdir(path) :
        file_info = os.stat(path+f_name)
        file_size = file_info[6]
        if (file_info[0] & 0x4000 ) : continue
        msg = f"{f_name}"
        print( msg )
        f.write( msg + '\n' )