Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python监视QNAP FTP目录的更改并发送UDP消息_Python_Ftp_Qnap - Fatal编程技术网

Python监视QNAP FTP目录的更改并发送UDP消息

Python监视QNAP FTP目录的更改并发送UDP消息,python,ftp,qnap,Python,Ftp,Qnap,我需要编写一个程序,监视ftp服务器上的目录,然后发送一条带有新文件路径的消息。因此,我确实为本地文件夹使用了watchdog,因为我只需要创建事件: if __name__ == "__main__": patterns = "*" ignore_patterns = "" ignore_directories = False case_sensitive = False my_event_ha

我需要编写一个程序,监视ftp服务器上的目录,然后发送一条带有新文件路径的消息。因此,我确实为本地文件夹使用了
watchdog
,因为我只需要创建事件:

if __name__ == "__main__":
    patterns = "*"
    ignore_patterns = ""
    ignore_directories = False
    case_sensitive = False
    my_event_handler = PatternMatchingEventHandler(patterns, ignore_patterns, ignore_directories, case_sensitive)

    def on_created(event):
        byte_message = bytes(f"{event.src_path}", "utf-8")
        opened_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        opened_socket.sendto(byte_message, ('address', port))
        print(f"{event.src_path} created")
    
    my_event_handler.on_created = on_created

    path = r"local/path"
    go_recursively = True
    my_observer = Observer()
    my_observer.schedule(my_event_handler, path, recursive=go_recursively)

    my_observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        my_observer.stop()

但是当我尝试用FTP上的文件夹替换
路径时,我得到了
访问被拒绝
,这是正确的,因为我没有设置登录名和密码。之后,我根据堆栈溢出的回答执行了此操作:

ftp = FTP()
ftp.set_pasv(True)
ftp.connect("address")
ftp.login('user', 'pass')

def changemon(dir='ftp/path/*'):
    ls_prev = set()

    while True:
        ls = set(ftp.nlst(dir))

        add = ls-ls_prev
        if add: 
            yield add 
        ls_prev = ls
        sleep(5)

for add in changemon():
    byte_message = bytes('\n'.join(r'address%' % i for i in add), 'utf-8')
    opened_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    opened_socket.sendto(byte_message, ('address', port))
问题是它会获取
目录中出现的每个文件

所以我需要一些可以从中提取子文件夹名和文件名的内容。如下所示:
file1
file2
是新创建的:

ftp/path/5000/file1
ftp/path/5001/file2

print('Folder is: ' + foldername)
Folder is: 5000
Folder is: 5001
print('New file is: ' + filename)
New file is: file1
New file is: file2


欢迎任何帮助。

这是一个可行的解决方案,因为我无法从商店中找到任何可以帮助我的东西(任务是用python制作):


这不是最漂亮的解决方案,但能完成任务。斜杠是指向oposite的,因为消息需要在Windows中读取。然后将
path
变量插入数据库。

它第一次运行时将始终返回每个文件,因为您的
ls\u prev
将为空。因此,如果此代码位于一个结束并重新启动的进程中,则必须找到一种方法来保存
ls_prev
的值,并在进入循环之前将其读回。一个简单的泡菜就可以了。请记住,这不会检测到正在更改的文件(上载了相同文件名的新版本)。@T0ny1234这会造成很大噪音,您确定只能远程运行该代码吗?@user3732793是的,它用于监视QNAP ftp目录。这是我唯一知道如何完成任务的方法。如果你有时间,你能建议一个更好的方法吗?取决于你有什么qnap。看起来有些有SNMP接口。此处,icinga插件SNMP用于网络设备管理。所以,是的,你可以在这些调用上写一个脚本循环,设备会告诉你发生了什么。这涉及到一些学习曲线
from ftplib import FTP
from time import sleep
import os
import byte
import socket
import numpy as np
import pandas as pd

ftp = FTP()
ftp.set_pasv(True)
ftp.connect("some-ip-address")
ftp.login('user', 'password')

def changemon(dir='/dir/*'):
    ls_prev = set()

    while True:
        ls = set(ftp.nlst(dir))

        add = ls-ls_prev
        if add:
            yield add

        ls_prev = ls
        sleep(5)

#tcp
for add in changemon():
    result = [i for i in add]
    array = np.array(result, dtype='str')
    df = pd.DataFrame(array, columns=None, index=None)
    for a in array:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        name = a.split('/')
        separator = ''
        path = (r'ip\dir\\' + str(name[2]) + '\\' + str(name[3]))
        device = name[2]
        message = bytes(separator.join(f'{device} desired string for the IP notification  \n'), 'utf-8')
        s.send(message)
        sleep(5)